在读此文之前,请先阅读《有符号整数与无符号整数》:
一、原码、反码、补码
数在计算机里是以二进制来表示的。数分为有符号数和无符号数。对于有符号数来说,最高位用来表示符号,1为负,0为正。
原码:一个数本身的二进制形式。
例(1):00000001表示1
例(2):10000001表示-1
反码:正数的反码是它本身,负数的反码是原码的最高位(符号位)不变,其他位取反。
例(3):00000001的反码是00000001
例(4):10000001的反码是11111110
补码:计算机中存储的就是数的补码形式。正数的补码和它的原码、反码相同;负数的补码是反码加1。
例(5):00000001的补码是00000001
例(6):10000001的补码是11111111
原码与补码的转化规律:
(1)正数
补码=原码=反码
(2)负数
补码=原码取反+1
原码=(补码-1)取反
二、C语言中%d与%D的区别
C语言中,%d是有符号的整型格式符,%D是Mac系统下的无符号整型格式符,相当于Windows系统下的%u。Windows下没有%D格式符。
例(1):-3
-3的二进制原码是10000000,00000000,00000000,00000011,
它在计算机中的储存形式(补码)为11111111,11111111,11111111,11111101
对应的无符号数为1 * 2^31 + 1 * 2^30 + …… + 1 * 2^2 + 1 * 2^1 + 0 * 2^0 = 4294967293
例(2):-27
-27的二进制原码是10000000,00000000,00000000,00011011,
它在计算机中的储存形式(补码)为11111111,11111111,11111111,11100101
对应的无符号数为1 * 2^31 + 1 * 2^30 + …… + 1 * 2^5 + 0 * 2^4 + 0 * 2^3 + 1 * 2^2 + 0 * 2^1 + 1 * 2^0 = 4294967267
例(3):-243
-243的二进制原码是10000000,00000000,00000000,11110011,
它在计算机中的储存形式(补码)为11111111,11111111,11111111,00001101
对应的无符号数为1 * 2^31 + 1 * 2^30 + …… + 0 * 2^7 + 0 * 2^6 + 0 * 2^5 + 0 * 2^4 + 1 * 2^3 + 1 * 2^2 + 0 * 2^1+ 1 * 2^0 = 4294967053
三、编程验证
现在,编写C程序来对上面三个例子的计算结果进行验证。由于本人是在Windows下编写的程序,所以程序里用%u而不是%D。
代码:
#include
int main(int argc, const char * argv[])
{
int a,b,c;
a = -3;
b = -27;
c = -243;
printf("有符号a=%d\t无符号a=%u\n", a, a);
printf("有符号b=%d\t无符号b=%u\n", b, b);
printf("有符号c=%d\t无符号c=%u\n", c, c);
return 0;
}
运行结果: