1、计算机中存储的补码,输出的是源码。
解释:
int max = 0x7fff ffff; //+2147483647
printf("%d",max);//输出的是+2147483647,因为正数的补码就是他本身
int min = 0x8000 0000; //-2147483648
printf("%d",min);//输出的是-2147483648,即输出的是源码
printf("%x",min);//输出的是8000 0000,即输出的是补码
也就是说,写成的是十六进制数的情况,写的其实是补码,也就是说,同一个十六进制数,要看数据类型,不同的数据类型,输出的十进制数是不同的。
所以,写常量写16进制数,写成啥样,就是啥样,但转换成十进制数则就需要看数据类型了。即:常量写成十六进制,所见即所得
正数的补码与源码一样。
3、负数的补码是符号位不变,源码取反加1。
4、符号位是0表示正数,符号位是1表示负数//记忆方法,我们平常的十进制数字,正数前面的+都会被省略,而负数前面的-不能省略;同样,对于8位的字符型,0000 0001,就如同正数前面的加号可以省略一样,前面的0都可以省略,即可以写成1,默认就是正数1;1000 0001,开始位的1表示这是-1,不能省略。
5、负数的源码与补码的关系:可以理解为负数的源码和补码互补。互补可以理解为二者之和为最大数(如4+6=10;3+7=10)
如:000 0001+111 1111 =1000 0000 //符号位不管
又如:000 0000 + 1 0000 0000 =1 0000 0000
规律:负数的的补码是源码取反+1;补码的补码是源码;源码与补码互为补码。
char a; //是有符号的占1个字节的8位字符型。
范围是 -256~255
1个字节有符号位补码:
源码 | 补码 |
0111 1111 | 0111 1111 |
0111 1110 | 0111 1110 |
0111 1101 | 0111 1101 |
... | ... |
0000 0000 | 0000 0000 |
1000 0000 | 1(1)000 0000 |
1000 0001 | 1111 1111 |
... | ... |
1111 1111 | 1000 0001 |
分析:
为什么是-128~127,而不是-127~127.
答:由上表可知,0分正0(0000 0000)和负0(1000 0000),我们知道,+0和-0是一个数,所以,保留正0。再看多出来的负0,我们看负0(1000 0000)的补码,按照源码与补码互补的原则,源码与补码之和是1000 0000(128),所以,负0 的补码是-128