在32为机器上,计算机存储数据是用32个比特位来存储数据的,而一个比特位可以存储一个二进制位的0或1。那么在64位机器上,存储数据就是用64个比特位来存储数据。所以即使是一个数字,在32位机器上,也要用32个比特位(二进制位)来存储。在本篇博文中,以32位机器为例。
整数的2进制表示方法有三种,即原码、反码和补码 有符号整数的三种表示方法中,包括符号位和数值位两部分,2进制序列中,最高位的1位是被当做符号位,剩余的都是数值位。 符号位都是用0表示“正”,用1表示“负”。 注:符号位可以参与加减运算
正整数的原、反、补码都相同。 负整数的三种表示方法各不相同。
如果你第一次接触原码、反码、补码,是不是觉得补码得到原码的第一种方法很容易理解就是:补码-1得到反码,得到的反码除符号位外按位取反得到就是原码。但不能一下就接受第二种方法?那我就在这里举个例子,帮助大家理解吧!
我们先写出-1的原反补: -1的原码:10000000000000000000000000000001 -1的反码:11111111111111111111111111111110 -1的补码:11111111111111111111111111111111 开始补码 取反、+1 补码取反:100000000000000000000000000000000 +1: 100000000000000000000000000000001
取反、+1得到的结果与原码一样,所以这种方法也是行得通的。
小提示:可以记住-1的补码二进制位全是1,因为我们经常会遇到它哦!
为什么呢?
我们举例说明。
计算1 - 1
CPU只有加法器,所以相当于1+(-1): 1的原码,反码,补码:00000000000000000000000000000001 -1的原码:10000000000000000000000000000001 -1的反码:11111111111111111111111111111110 -1的补码:11111111111111111111111111111111 若使用原码进行计算结果为:10000000000000000000000000000010即-2但正确结果是0 而我们使用补码进行计算,结果为:100000000000000000000000000000000 可以看到+1之后就有33个二进制位了,但是32位机器存储数据是用32个比特位来存储的,所以我们要选择舍弃一位比特位,在这里我们丢弃最高位。 所以,补码+1的结果是:00000000000000000000000000000000即0,答案正确
#include <stdio.h>
int i;
int main()
{
i--;
if (i > sizeof(i))
{
printf(">\n");
}
else
{
printf("<\n");
}
return 0;
}
解析:答案是A
C语言中,0为假,非0即为真。 全局变量,没有给初始值时,编译其会默认将其初始化为0。 i的初始值为0,i--结果-1,i为整形,sizeof(i)求i类型大小是4,按照此分析来看,结果应该选择B,但是sizeof的返回值类型实际为无符号整形,因此编译器会自动将左侧 i 自动转换为无符号整形的数据,-1对应的无符号整形是一个非常大的数字,超过4或者8,故实际应该选择A 这道题其实很隐蔽,真是虾仁猪心!!!
所以,在计算机系统中,数值一律用补码来表示和存储。原因在于,使用补码,可以将符号位和数值位统一处理;同时,加法和减法也可以统⼀处理(CPU只有加法器)此外,补码与原码相互转换,其运算过程是相同的,不需要额外的硬件电路。
只有一点小小归纳,希望能帮到大家! 如果大家发现知识点错误的话,请帮忙指出,十分感谢!! 也请大家帮忙点赞、评论,这将督促我前行,大家一起加油!!!
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有