C语言中源码和补码详解

1、计算机中存储的补码,输出的是源码。

解释:

int max = 0x7fff ffff;   //+2147483647

printf("%d",max);//输出的是+2147483647,因为正数的补码就是他本身

int min = 0x8000 0000;  //-2147483648

printf("%d",min);//输出的是-2147483648,即输出的是源码

也就是说,写成的是十六进制数的情况,写的其实是补码。

正数的补码与源码一样。

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

发布了25 篇原创文章 · 获赞 18 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/modi000/article/details/103882926
今日推荐