C语言入门 – 整数编码形式

LongGuan_admin 发布于 8 天前 20 次阅读


在计算机中整数存储的是数据的补码


原码:

正数直接使用二进制数来表达
eg: a=100 在内存中保存为 0000 1100 110

反码:

符号位不变 ,其他位取反

//以一个字节数据为例
char num1 = 7;  //原码 0000 0111 反码 0000 0111
char num2 = -7; //原码 1000 0111 反码 1111 1000

从上述的num1和num2可以看出,原码无法进行减法运算

num1与num2相加,得到1111 1111 转为原码得到1000 0000 得到-0。 若num1不等于num2 计算结果会出错,所以需要用到补码来进行数值的运算

补码:

若数字为正数,反码就是原码

若数字为负数,反码等于原码取反码后对值加一(符号位不动

  • 补码 1000 0010 反码 1000 0001 原码 1111 1110 即 -126
  • 补码 1000 0001 反码 1000 0000 原码 1111 1111 即 -127
  • 补码 1000 0000 唯一一个只有补码没有源码反码的数字, 强制设置其为 -128

一个字节的有符号整形 hhd% 取值范围 127 ~ -128

7 与 -7相加
                  7 原码 0000 0111   反码  0000 0111  补码  0000 0111
                 -7 原码 1000 0111   反码  1111 1000  补码  1111 1001
                  补码相加   0000 0000  即 0
7 与 -6相加
                  7 原码 0000 0111   反码  0000 0111  补码  0000 0111
                 -6 原码 1000 0110   反码  1111 1001  补码  1111 1010
                  补码相加   0000 0001  即 1
6 与 -7相加
                  6 原码 0000 0110   反码  0000 0110  补码   0000 0110 
                 -7 原码 1000 0111   反码  1111 1000  补码   1111 1001
                  补码相加    1111 1111  转反码  1111 1110  原码   1000 0001  即 -1

此作者没有提供个人介绍。
最后更新于 2026-01-08