【发布时间】:2014-05-28 00:45:08
【问题描述】:
我有以下代码:
unsigned char chr = 234; // 1110 1010
unsigned long result = 0;
result = chr << 24;
现在结果将等于 18446744073340452864,即二进制的 1111 1111 1111 1111 1111 1111 1111 1111 1110 1010 0000 0000 0000 0000 0000 0000。
当 chr 未签名时,为什么要进行符号扩展?
此外,如果我将移位从 24 更改为 8,则结果为 59904,即二进制的 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 1110 1010 0000 0000。为什么这里没有扩展? (任何 23 或更少的班次都没有对其进行符号扩展)
在我当前的平台上,sizeof(long) 也是 8。
转换时自动转换为更大尺寸类型的规则是什么?在我看来,如果移位是 23 或小于 chr 被强制转换为无符号类型,如果它是 24 或更大,它被强制转换为有符号类型? (以及为什么用左移来完成符号扩展)
【问题讨论】:
-
你如何打印/读取值?
-
使用 gdb 的打印。但这不是打印的问题,因为我在结果上使用了按位 OR 并且由于所有前导 1 而它搞砸了。
-
我使用codepad.org/zHW9scz4 到11101010 << 24 = 0000000000000000000000000000000011101010000000000000000000000000(没有符号扩展)
-
简短的版本是积分促销将
chr更改为int,然后应用移位(通过移位到符号位引起UB)。 -
@MattMcNabb,为什么不将其提升为 unsigned int 因为 chr 是未签名的
标签: c types shift sign-extension