我在这里查看符号扩展: http ://www.shrubbery.net/solaris9ab/SUNWdev/SOL64TRANS/p8.html
struct foo {
unsigned int base:19, rehash:13;
};
main(int argc, char *argv[])
{
struct foo a;
unsigned long addr;
a.base = 0x40000;
addr = a.base << 13; /* Sign extension here! */
printf("addr 0x%lx\n", addr);
addr = (unsigned int)(a.base << 13); /* No sign extension here! */
printf("addr 0x%lx\n", addr);
}
他们声称:
------------------ 64位:
% cc -o test64 -xarch=v9 test.c
% ./test64
addr 0xffffffff80000000
addr 0x80000000
%
------------------ 32位:
% cc -o test32 test.c
% ./test32
addr 0x80000000
addr 0x80000000
%
我有3个问题:
- 什么是符号扩展?是的,我阅读了 wiki,但不明白何时发生类型提升,符号扩展是怎么回事?
- 为什么 ffff .. 在 64 位(参考地址)?
- 当我进行类型转换时,为什么没有符号扩展?
编辑: 4. 为什么不是 32 位系统的问题?