C语言 原码、反码、补码
一、有符号数的编码规则
原码:最高位为符号位,其余各位为数值本身的绝对值。
反码:正数的反码与原码相同;负数的反码,符号位为1,其余位对原码取反。
补码:正数的补码与原码相同;负数的补码,符号位为1,其余位对原码取反加1
二、举例
比如1字节数据(8位)
1的原码为 00000001 (0x01)
1的反码为 00000001 (0x01)
1的补码为 00000001 (0x01)
-1的原码为 10000001 (0x81)
-1的反码为 11111110 (0xFE)
-1的补码为 11111111 (0xFF)
7的原码为 00000111 (0x07)
7的反码为 00000111 (0x07)
7的补码为 00000111 (0x07)
-7的原码为 10000111 (0x87)
-7的反码为 11111000 (0xF8)
-7的补码为 11111001 (0xF9)
测试程序:
#include <stdio.h>
int main()
{
char ch1 = 1;
char ch_1 = -1;
char ch7 = 7;
char ch_7 = -7;
printf("ch1的内存地址:%p\n",&ch1);
printf("ch_1的内存地址:%p\n",&ch_1);
printf("ch7的内存地址:%p\n",&ch7);
printf("ch_7的内存地址:%p\n",&ch_7);
return 0;
}
下断点,调试程序,查看内存
三、总结
正数原码存储,负数补码存储。
假设内存中有这么一字节的数据 :11010111
按照无符号解析--》0xD7
按照有符号解析--》0xA9
最高位是1,说明是负数,那么11010111是一个负数的补码,因为负数是用补码存储的。
补码是 11010111
那么反码是 11010110
源码是 10101001 (0xA9)