二进制的源码 补码 反码

二进制

我们常用的十进制是「逢十进一」的,我们只需要使用0、1、2、3、4、5、6、7、8、9这10个数字符号,

就能表示所有的自然数。与此类似,二进制是「逢二进一」的进位制,它只需要使用0、1这两个数字符号,就能表示所有的自然数。

例如

0000 0000(二进制) 表示 0(十进制)

0000 0001(二进制) 表示 1(十进制)

0000 0111(二进制) 表示 7(十进制)

11111111(二进制) 表示 255(十进制)

正数的原码  反码 补码都是本身


负数的 反码:先取绝对值,保留第一位符号位,剩余的取反;

      补码:在反码的基础上 最后一位加一;


注意:0的反码、补码都为

在计算机系统中,数值一律用补码表示(存储),原因在于:使用补码,可以将

符号位和其它位统一处理;同时,减法也可按加法来处理。另外,两个用补

码表示的数相加时,如果最高位(符号位)有进位,则进位被舍弃。

在计算机系统中,数值一律用补码表示(存储),原因在于:使用补码,可以将

符号位和其它位统一处理;同时,减法也可按加法来处理。另外,两个用补

码表示的数相加时,如果最高位(符号位)有进位,则进位被舍弃

在计算机系统中,数值一律用补码来表示和存储。原因在于,使用补码,可以将符号位和数值域统一处理;

同时,加法和减法也可以统一处理。此外,补码与原码相互转换,其运算过程是相同的,不需要额外的硬件电路。



在计算机系统中,数值一律用补码表示(存储),原因在于:使用补码,可以将

符号位和其它位统一处理;同时,减法也可按加法来处理。另外,两个用补

码表示的数相加时,如果最高位(符号位)有进位,则进位被舍弃。

在C中 对于溢出的数据

C语言的整型溢出,分为无符号整型溢出和有符号整型溢出。
对于unsigned整型溢出,C的规范是有定义的——“溢出后的数会以2^(8*sizeof(type))作模运算”,也就是说,如果一个unsigned char(1字符,8bits)溢出了,会把溢出的值与256求模。如:
1.unsigned char x = 0xff;

2.printf("%dn", ++x);
上面的代码会输出:0 (因为0xff + 1是256,与2^8求模后就是0)
对于signed整型的溢出,C的规范定义是“undefined behavior”,也就是说,编译器爱怎么实现就怎么实现。

在计算机系统中,数值一律用补码表示(存储),原因在于:使用补码,可以将

符号位和其它位统一处理;同时,减法也可按加法来处理。另外,两个用补

码表示的数相加时,如果最高位(符号位)有进位,则进位被舍弃




在计算机科学中,原码、反码补码是表示有符号整数的三种二进制形式。这些编码方式主要用于解决负数在计算机中的表示与运算问题。 ### 原码 原码是最直观的二进制表示法,其中最高位被用作符号位(0代表正数,1代表负数),其余位则表示数值的大小。例如,对于一个8位系统来说,数字+5的原码表示为`00000101`,而-5的原码则是`10000101`。然而,原码存在一些缺陷,尤其是在执行加减法操作时,需要额外的逻辑来处理符号位的问题[^4]。 ### 反码 反码是对原码的一种改进。对于正数而言,其反码与其原码相同;而对于负数,则是在原码的基础上,除了符号位之外的所有位取反(即0变1,1变0)。比如,在8位系统中,-5的反码表示为`11111010`。尽管反码解决了某些情况下加减法的问题,但它仍然保留了+0和-0的概念,这导致了数据表示上的冗余。 ### 补码 补码进一步优化了反码,它不仅解决了加减法的问题,还消除了+0和-0同时存在的状况。正数的补码与原码一致,而负数的补码则是其对应的反码加1的结果。以-5为例,在8位系统中,它的补码是`11111011`。通过使用补码,可以简化硬件设计,使得计算机能够更高效地进行算术运算。例如,当我们要计算`1 - 1`时,可以通过将+1(`00000001`)与其相加得到结果`00000000`,也就是0[^4]。 ### 工作原理 在实际应用中,大多数现代计算机都采用补码来表示有符号整数。这是因为补码允许直接利用相同的电路来进行加法和减法运算,并且能够正确处理包括负数在内的所有整数运算。此外,由于补码只有一种零的形式,这也避免了可能出现的数据比较错误[^4]。 下面是一个简单的C语言示例,演示如何在一个程序中观察到变量从`char`类型提升到`int`类型时补码的变化: ```c #include <stdio.h> int main() { char a = -50; // a 的补码为 11001110 short b = a; // 提升至 short 类型 int c = a; // 提升至 int 类型 printf("%d\n", b); // 输出 -50,补码为 11111111 11001110 printf("%d\n", c); // 输出 -50,补码为 11111111 11111111 11111111 11001110 return 0; } ``` 在这个例子中可以看到,当较小类型的变量被赋值给较大类型的变量时,为了保持数值不变,会在高位填充相应的符号位,这个过程称为符号扩展或类型提升[^5]。 理解原码、反码以及补码有助于深入掌握计算机内部是如何处理数值特别是负数的,这对于学习底层编程、嵌入式系统开发等领域尤为重要。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值