【发布时间】:2021-04-20 15:53:02
【问题描述】:
请看下面的代码 sn-p,它基本上只是将 1 字节左移 24 位。
uint64_t i = 0xFFFFFFFF00000000;
printf("before: %016llX \n", i);
i += 0xFF << 24;
printf("after : %016llX \n", i);
// gives:
// before: FFFFFFFF00000000
// after : FFFFFFFEFF000000
最重要的 32 位是 FFFFFFFE(注意最后的 E)。这不像我预期的那样。我不明白为什么将 1 个字节左移 24 位会触及第 32 位(第 31 位应该是最后一个修改的)它将最后一个 F (1111) 更改为 E (1110)) .
为了使其正常工作,我使用了0xFF unsigned (0xFFU)。
uint64_t i = 0xFFFFFFFF00000000;
printf("before: %016llX \n", i);
i += 0xFFU << 24;
printf("after : %016llX \n", i);
// gives:
// before: FFFFFFFF00000000
// after : FFFFFFFFFF000000
为什么有符号整数 (0xFF) 的位移位触摸/重置太多了?
【问题讨论】:
-
但你不只是在转移。你也在做加法。
-
我认为
0xFF会强制编译器将您的值转换为int64_t。我错了吗? godbolt.org/z/88T16Y5G5 -
@Hrant 不,
0xFF << 24中没有演员表。整个班次以int精度完成,然后结果被转换为uint64_tWhy does shifting 0xff left by 24 bits result in an incorrect value?, bit shifting with unsigned long type produces wrong results