int型整数在内存中的存储方式
来源:互联网 发布:社交网络信息 综述 编辑:程序博客网 时间:2024/06/09 21:34
int类型在内存中的方式
起因:话说楼主在写一个将string类型转化为int类型的函数,就是把atoi()这个函数重写一下,当考虑到溢出这种情况的时候,写下了这样一行代码:
if((!minus&&num>0x7fffffff)||(minus&&num<ffffffff)){ num=0; break;} 注:bool minus 是判断该数字是正还是负。
等到测试的时候发现输入一个负数的字符串,得到的结果居然是0。
我敏锐的发掘,一定是num=0这句起了作用,但是按说不应该进入这个if语句啊。
于是我开始分析,int类型是带符号的类型,即第一位是符号位,当符号位为0的时候表示正数,当符号位为1的时候表示负数,那我输入的应该没错啊,0xffffffff
不应该是十进制数2147483647
这个数的负数模式-2147483647么??
楼主不解,于是开始试验。
int i=0xffffffff; cout << i;} 输出结果:-1
我就震惊了,明明应该是那么多位的负数,而且这么多个f就给我个-1,我真想问电脑你是怎么想的。后来我看了一下书,书上类似的判断用的是 minus&&num<80000000
于是我有些下了下面的代码
int i=0x80000000; cout << i;} 输出结果:-2147483648
好吧,看来书上是对的,也不知道电脑是怎么想的怎么翻译的?
于是我开始认真思考这个问题,电脑是怎么想的,发明c++语言的人是怎么想的,以及为什么?
上学的时候隐约记得好像和加法还有减法有关。
于是拿出纸笔,开始模拟。
首先我把int 1和int -1相加,即0x0000001+0xffffffff
,诶,奇迹来了,结果是0x100000000,大家看好是9个16进制位哦,而按照int型的存储空间应该是8个16进制位,即4个字节,于是
就剩下0x00000000,这不正好是0么!于是楼主虎躯一震,继续试验。
如果是int 1减去int -1呢?
即0x00000001-0xffffffff
这咋减?于是楼主联想上面的例子,决定在整数前面补1位,即0x100000001-0xffffffff
得到的结果正好是0x00000002。于是我服了,人家发明的人想的果然就比我们多啊,你想啊,如果是这样就不用进行符号转化了啊,否则,如果按照我之前的理解,-1是0x80000001的话,1+(-1)就应该是先把-1转化为+1,再做加法即0x00000001+0x00000001=0x00000002,这样的话处理起来太麻烦了,而且遇到正数和负数的处理过程不一样大大影响效率。
好了上面的分析分析完了,接下来我说说其他的拓展心得。
1.如果你看见了一个类似0xfffffffa
怎么判断它是负几呢?很简单,用0x100000000-0xfffffffa
得出来的数加个负号就是了。
2.如果想将一个int型整数取反直接使用符号“~”然后再+1即可,这个方法在效率上比使用符号块,因为是位操作,比运算符操作要快。
如:a=~a+1
- int型整数在内存中的存储方式
- int类型在内存中的存储方式
- int类型在内存中的存储方式
- 整数在内存中的存储
- int型在内存中的存储方式与高低字节(大小端)
- short与int型在内存中的存储形式
- 整数在内存中的存储形式。。
- 整数,浮点数在内存中的存储
- 整数,浮点数在内存中的存储
- 整数、浮点数在内存中的存储
- 深入理解计算机系统-之-数值存储(四)--整数在内存中的存储方式
- float型数据在内存中的存储方式
- 浮点型和整型在内存中的存储方式
- 整型、浮点型在内存中的存储方式
- 浮点数在内存中的存储方式
- 位图在内存中的存储方式
- 浮点数在内存中的存储方式
- 浮点数在内存中的存储方式
- Android Studio下载安装
- 系统调用
- Springboot 源码解析(启动时)
- Runtime简单粗暴理解
- boostrap的日期选择:datetimepicker 做 开始时间与 结束时间的判断,开始时间小于结束时间
- int型整数在内存中的存储方式
- webrtc linux 和 android 版本下载与编译
- 操作系统的体系结构:大内核和微内核
- 个人主页
- svn: E155004 is already locked(文件加锁,执行clean up命令)
- 常用java中I/O流
- 实现FTP文件上传与下载
- 生日悖论的解答
- Windows Server 2012 禁止使用Ctrl+Alt+Del 以及禁止开机启动服务器管理器