gpt4 book ai didi

c - C 中的移位、类型和符号扩展

转载 作者:行者123 更新时间:2023-12-01 08:52:31 26 4
gpt4 key购买 nike

我有以下代码:

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 或更多它被转换为有符号类型? (为什么符号扩展甚至是通过左移完成的)

最佳答案

chr = 234 , 表达式 chr << 24单独评估:chr被提升为(32 位签名)int并左移 24 位,产生一个负数 int值(value)。当您分配给 64 位 unsigned long ,符号位通过 64 位值的最高有效 32 位传播。注意计算chr << 24的方法本身不受赋值的影响。

当移位仅为 8 位时,结果为正(32 位带符号)整数,并且该符号位 (0) 通过 unsigned long 的最高有效 32 位传播。 .

关于c - C 中的移位、类型和符号扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23901222/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com