C语言中源码和补码详解

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 11110111 1111
0111 11100111 1110
0111 11010111 1101
......
0000 00000000 0000
1000 00001(1)000 0000
1000 00011111 1111
......
1111 11111000 0001

分析:

为什么是-128~127,而不是-127~127.

答:由上表可知,0分正0(0000 0000)和负0(1000 0000),我们知道,+0和-0是一个数,所以,保留正0。再看多出来的负0,我们看负0(1000 0000)的补码,按照源码与补码互补的原则,源码与补码之和是1000 0000(128),所以,负0 的补码是-128

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值