整数的二进制存储问题(以 short 和 unsigned short 为例)

来源:互联网 发布:电脑手机码字软件 编辑:程序博客网 时间:2024/05/22 10:04
今天折腾的好久 二进制的问题 我们先看下面的小例子和结果 (运行环境为vs2010)

     

 short i1=32767;short i2=32768;short i3=32769;short i4=-32768;short i5=-32769;cout<<i1<<endl;  //32767cout<<i2<<endl;  //-32768cout<<i3<<endl;  //-32767cout<<i4<<endl;  //-32768cout<<i5<<endl;  //32767unsigned short j1=65535;unsigned short j2=65536;unsigned short j3=65537;unsigned short j4=-65535;unsigned short j5=-65536;unsigned short j6=-1;cout<<j1<<endl;  //65535cout<<j2<<endl;  //0cout<<j3<<endl;  //1cout<<j4<<endl;  //1cout<<j5<<endl;  //0cout<<j6<<endl;  //65535

计算机基础知识不扎实 想了半天 查了半天资料 才基本摸清楚(若有问题 希望有人能给我讲一下 )

首先 对于 signed short  其 共有16个字节(对于我的机子是这样的) 第一位是符号位

注意在计算机中 整形是用的 补码进行存储   正数的补码就是他自己  负数的补码 是其除符号位以外 其他各位求反后 ,最后位再加一


对于有符号的 第一位 为符号位 0为正  1为负

利用补码可以拓宽整数的下界  即若用原码表达 (位数为8时 )最小值 为 1111  1111  1111  1111值为 -127  其补码为1000 0000 0000 0001

大家可以很清楚的看到 补码还可以再减一的 (即-127-1=-128)为 1000 0000 0000 0000.

其表达数字的范围为  1000 0000 0000 0000-------0111 1111 1111 1111   故 其范围为 -32768---32767

所以对于上面输入的 i1 , i4结果就很清楚  

那么对于 i2 : 0111 1111 1111 1111  +1 计算其值为 1000 0000 0000 0000 为 -32768

        对于 i3 : 1000 0000 0000 0000  +1 计算其值为 1000 0000 0000 0001 因为是补码 所以 换为原码就是1111 1111 1111 1111 即为 -32767

        对于i5 :     1000 0000 0000 0000   -1  计算其值为 0111 1111 1111 1111 正数的补码还是自己 所以 其值就是 32767


好了  对于有符号的搞清楚了 对于无符号的 就简单多了 无符号的 能表达的范围 为 0000 0000 0000 0000-------1111 1111 1111 1111 即 0---65535

对于 j1 不解释

对于 j2 1111 1111 1111 1111 + 1 =0000 0000 0000 0000 第一位越界被解掉了

对于 j3 再加1而已 不解释

对于 j4 -65535 (事实上不存储 越界的位数 这里我们借一位 作解释) 原码 为 1 1111 1111 1111 11111 其补码为 1 0000 0000 0000 0001 

然后截掉第一位 剩下的为 0000 0000 0000 0001 值就为1了

对于 j5 若按上面的方法 其补码为 1 0000 0000 0000 0000 截掉第一位 值为0 或是 用 -65535-1 =1-1=0

对于 j6 其原码 为 1000 0000 0000 0001 补码为 1111 1111 1111 1111 值为 65535

嗯 差不多解释成这样了 关键是要搞明白 有符号时的 1000 0000 0000 0000 表达的数是多少 这是 所有问题的转折点了






原创粉丝点击