读书人

一个关于输出格式的简单有关问题

发布时间: 2012-05-29 12:16:00 作者: rapoo

一个关于输出格式的简单问题
有下面的代码:
unsigned short A = 10;
printf("~A = %u\n", ~A);// 按位取反 是先补0 成四个字节 还是 先取反 在补0?
char c=128;
printf("c=%d\n",c);

结果是:4294967285
和 -128;

我的c基础不太好,谁能帮我详细的解释一下? 谢谢了!!


[解决办法]
printf("~A = %u\n", ~A);
%u这个会把那个参数默认转换为unsigned int类型
printf("c=%d\n",c);
%d会把第一个参数转换为int类型,char c = 128;用二进制表示为:10000000,某些平台上扩展为int就是11111111111111111111111110000000
就是-128
[解决办法]
其实楼主如果纠结这样的问题的话,可以转到反汇编去查看每个寄存器的值就知道了。

[解决办法]
第一个问题:C语言有一个叫integer promotion的概念。当对某些小型整型(比如short,char)进行某些单操作符操作(+,-,~等)的时候,编译器会先把你的类型变成int或unsigned int,然后进行处理。

这里A是0xA,做~A是,先变成0x0000000A,然后取反,所以变成了0xFFFFFFF5,也就是你打出来的那个数4294967285

你还可以试试-A,打出来也是个大数。把short换成char也一样。事实上,在实际运用中你没有必要用short来节省空间,这样容易犯错,而且程序效率由于内存没有对齐,说不定还会变低。

第二个问题: char本身是带符号的-128~+127。你给了个128,自然就被当成-128了。再转换成int,还是-128.

读书人网 >C++

热点推荐