原码,补码,反码
bit BYTE WORD DWORD
1 BYTE = 8 bit
1 WORD = 2 BYTE
1 DWORD = 2 WORD
原码
定义:将最高位做为符号位(0代表正,1代表负),其余各位代表数值本身的绝对值.
反码
定义:一个数如果值为正,那么反码和原码相同;一个数如果为负,那么符号位为1,其他各位与原码相反
补码
定义:正数:原码,反码补码都相同;负数:最高位为1,其余各位原码取反,最后对整个数 + 1
-7的表达方式(正数的原码,反码,补码都一样,所以下面不予讨论)
原码
1000 0000 0000 0000 0000 0000 0000 0111
反码
1111 1111 1111 1111 1111 1111 1111 1000
补码
1111 1111 1111 1111 1111 1111 1111 1001
代码验证
-7的十六进制输出,也就是补码输出
printf("%x\n", 7);
7
-7的十六进制输出,也就是补码输出
printf("%x\n", -7);
fffffff9
1111 | 1111 | 1111 | 1111 | 1111 | 1111 | 1111 | 1001 |
---|---|---|---|---|---|---|---|
f | f | f | f | f | f | f | 9 |
- 如果是补码转换原码也是补码加1,而不是减1
整数溢出
计算一个整数的时候超过整数能够容纳的最大单位后,整数会溢出,溢出的结果是高位舍弃(包括最大值溢出和最小值溢出)。
当一个小的整数赋值给大的整数,符号位不会丢失,会继承,(例:把int类型的-7赋值给long long类型的变量,这个变量还是-7,符号位会自动继承到long long类型的最高位)
无符号类型unsigned
printf("%u\n", -7);
4294967289
4294967289转化成16进制就是0xFFFFFFF9
%u就是把符号位也当做一个整数一位输出,而不当做符号位;所以unsiged类型的数最小值是0。