C语言格式符%d与%D的区别

来源:互联网 发布:sql server2000下载 编辑:程序博客网 时间:2024/06/05 21:05


在读此文之前,请先阅读《有符号整数与无符号整数》:

http://blog.csdn.net/haishu_zheng/article/details/73104930

 

一、原码、反码、补码

数在计算机里是以二进制来表示的。数分为有符号数和无符号数。对于有符号数来说,最高位用来表示符号,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 <stdio.h>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;}

运行结果: