切记:
1. 计算机中都是按照补码来存储数的
2. 规定:整数的反码,补码跟原码一样,不需求去求。而负数则符号位不变,反码各位取反,补码在反码基础上再加1.
3。 计算类似以下例子的时候,第一件事就是把结构写出来,然后看存储位数,超出的则舍弃掉。
4. 注意假设为8位,i的补码 = 1 000 0000(符号位和数字位分隔开),这种格式的数,只有补码,没有原码和反码。
5. 求10进制的值一定要用原码,见例4
1. int i = 0; i = ~i, 则i值是?
首先0=0x00000000, 取反则是0xFFFFFFFF, 即是-1的补码。或者可以按求补码的方法逆序求得原值,首先最高位是1,所以肯定是个负数。
第一步减1(这是求补码的第二步)得0XFFFFFFFE
第二步值位取反得0X80000001 所以值是-1
2.
union Test
{
char a[4];
short b;
}
Test test;
test.a[0] = 256;
test.a[1] = 255;
test.a[2] = 254;
test.a[3] = 253;
则t在小端机器上test.b = ?
首先把test的内存结构写出来,
0xFD FE FF 00 因为256=10000 0000所以最高位1舍弃掉了。
b取两个字节,因为是小端机器,所以b结构是0xFF00,第一位是1所以肯定是负数。接下来按照第一个例子的方法算出原码是0x8100=-256.
3. short i = 65537; int j = i + 1; 则i, j值是?
首先i的二进制是0x1 0001, 但是因为是short,所以最高位要舍弃,于是就是0x0001,所以i是1,转成int,高位补0,还是1,所以j=1+1=2.
4. int i = -2147483648; 求~i, -i, 1-i, -1-i的值
首先i的16进制是8000 0000 即-2^31次方,这种格式只有补码。
取反,则是7FFF FFFF=2147483647
-i: 补码取反+1,首先取反7FFF FFFF, 然后+1, 还是8000 0000=-2147483648
1-i: -i的补码+1 = 8000 0001,所以原码是FFFF FFFF, -2147483647.
-1-i: -1的补码是FFFF FFFF, 加上-i则是7FFF FFFF,也是原码,因为是正数,所以是2147483647。
注意:计算机里的有符号跟无符号机器码(即补码)是一样的,所以要是无符号位来输出,则是2147483647, 2147483648, 2147483649, 2147483647.