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

原创粉丝点击