考虑以下例子:
#include <stdio.h>
int main(void)
{
unsigned char a = 15; /* one byte */
unsigned short b = 15; /* two bytes */
unsigned int c = 15; /* four bytes */
long x = -a; /* eight bytes */
printf("%ld\n", x);
x = -b;
printf("%ld\n", x);
x = -c;
printf("%ld\n", x);
return 0;
}
我正在使用GCC 4.4.7进行编译(且没有警告):
gcc -g -std=c99 -pedantic-errors -Wall -W check.c
我的结果是:
-15
-15
4294967281
问题是为什么无符号字符和无符号短整型的值都可以正确地“传递”给(有符号的)长整型,而无符号整型却不行?是否有任何参考或规则?
以下是来自 gdb
的结果(字节顺序为小端):
(gdb) x/2w &x
0x7fffffffe168: 11111111111111111111111111110001 11111111111111111111111111111111
(gdb) x/2w &x
0x7fffffffe168: 11111111111111111111111111110001 00000000000000000000000000000000
long
和long long
类型都是8字节。 - Grzegorz Szpetkowski