在阅读此句子之前,请阅读《有符号整数与无符号整数》 :
一、原码、反码、补码
数字在计算机中用二进制表示。 数分为有符号的数和没有符号的数。 对于有符号的数,最高位表示符号,1为负,0为正。
源代码:一个数本身的二进制格式。
例(1) 00000001表示1
例(2) 10000001表示-1
反码:正数反码本身,负数反码不改变原始码的最高有效位(码位),其他位取反。
例(3) 0000001的反码为0000001
例(4):10000001的反码为11111110
补数:计算机中存储的是数的补数格式。 正数补数与其原码、反码相同; 负数的补数为反符号加1。
例(5) 000001补码为0000001
例(6):10000001补码为11111111
源代码和补码转换规则:
(1)正数
补码=原码=反码
)2)负数
补数=原码取反1
原码=(补数-1)取反
二. %d和%d在c语言中的差异
在c语言中,%d是有符号整数格式符号,%d是Mac系统下的无符号整数格式符号,对应于Windows系统下的%u。 Windows没有%D格式。
例(1):-3
-3的二进制代码为100000000、00000000000000000000000000000000000000000000000000001,
计算机上存储的格式(补数)为11111111、11111111、1111111、11111101
相应的无符号数为1 *2^ 311 *2^ 30……1 *2^ 21 *2^ 10 *2^0=4294967293
例(2):-27
-27的二进制资源为10000000、00000000000000000000000000000000000000000000000011,
计算机中存储的格式(补数)为11111111、11111111、11111111、11100101
相应的无符号数为1 *2^ 311 *2^ 30……1 *2^ 50 *2^ 40 *2^ 31 *2^ 20 *2^1*2^0=4294967267
例(3):-243
-243的二进制代码为10000000,000000000,000000000000000011111110000000000000000000000000000000000000000000000000000000000000000000000000000000000000011111111111111111111111111110000000
存储在计算机上的格式(补码)为111111111、11111111、1111111和00001101
相应的无符号数为1 *2^ 311 *2^ 30……0 *2^ 70 *2^ 60 *2^ 50 *2^ 41 *2^ 31 *2^ 20 *2^ 11 *2^0=4294967053
三.编程验证
现在,为了验证以上三个例子的计算结果,编写c程序。 由于本人是在Windows上创建的程序,因此程序使用%u而不是%D。
代码:
#包含
(intmain(intargc,const char * argv[] ) ) ) ) ) ) ) ) ) )。
{
int a、b、c;
a=-3;
b=-27;
c=-243;
printf (带符号a=%dt无符号a=%un ',a,a );
printf (带符号b=%dt无符号b=%un ',b,b );
printf (带符号c=%dt无符号c=%un ',c,c );
返回0;
}
执行结果: