【发布时间】:2011-11-03 13:44:55
【问题描述】:
我遇到了以下示例程序,但我并不完全理解它的输出:
#include <stdio.h>
int main( void ) {
unsigned char i, m =0xFF, n=0x1;
for ( i = 0; i != 8; i++,n+=n, m/=2 )
printf("%5x %5x %5x %5x %5x %5x\n", n,m,n&m,n|m,n^m,~n);
return 0;
}
打印出来:
1 ff 1 ff fe fffffffe
2 7f 2 7f 7d fffffffd
4 3f 4 3f 3b fffffffb
8 1f 8 1f 17 fffffff7
10 f 0 1f 1f ffffffef
20 7 0 27 27 ffffffdf
40 3 0 43 43 ffffffbf
80 1 0 81 81 ffffff7f
问题是最后一列。由于它是无符号字符,我希望它在每列中只打印出 2 个位置。 ~n 作为结果生成一个无符号字符,但它似乎被转换为有符号的 32 位值并由 %5x 说明符扩展符号。
这怎么可能,这是怎么回事?
【问题讨论】:
-
n是unsigned char;~n是int(或者可能是unsigned int——现在懒得检查了)。试试printf("%d %d\n", (int)sizeof n, (int)sizeof ~n);:-) -
并非如此。
&、|、^和~操作将它们的操作数提升为[unsigned] int并产生[unsigned] int类型的值。 -
@pmg:是的,我刚刚在 K&R 中查到了,第 页。 197 - 198,第 A6.5 节算术转换:...否则,两个操作数的类型均为 int。
-
@pmg: 如果该类型可以容纳
unsigned char的所有值(很可能),则为int,否则为unsigned int。
标签: c