short i1=32767; short i2=32768; short i3=32769; short i4=-32768; short i5=-32769; cout<<i1<<endl; //32767 cout<<i2<<endl; //-32768 cout<<i3<<endl; //-32767 cout<<i4<<endl; //-32768 cout<<i5<<endl; //32767 unsigned 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; //65535 cout<<j2<<endl; //0 cout<<j3<<endl; //1 cout<<j4<<endl; //1 cout<<j5<<endl; //0 cout<<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 表达的数是多少 这是 所有问题的转折点了