gpt4 book ai didi

c++ - 为什么 static_cast 对表达式进行分配?

转载 作者:可可西里 更新时间:2023-11-01 18:25:22 24 4
gpt4 key购买 nike

我需要取 2 个无符号 8 位值并将它们相减,然后将此值添加到 32 位累加器。 8 位减法可能会下溢,这没关系(unsigned int 下溢是定义的行为,所以没有问题)。

我希望 static_cast<uint32_t>(foo - bar)应该做我想做的事(其中 foobar 都是 uint8_t )。但看起来这会先转换它们,然后然后执行 32 位减法,而我需要它作为 8 位变量下溢。我知道我可以只修改 256,但我想弄清楚为什么它以这种方式工作。

此处示例:https://ideone.com/TwOmTO

uint8_t foo = 5;
uint8_t bar = 250;

uint8_t diff8bit = foo - bar;
uint32_t diff1 = static_cast<uint32_t>(diff8bit);

uint32_t diff2 = static_cast<uint32_t>(foo) - static_cast<uint32_t>(bar);

uint32_t diff3 = static_cast<uint32_t>(foo - bar);

printf("diff1 = %u\n", diff1);
printf("diff2 = %u\n", diff2);
printf("diff3 = %u\n", diff3);

输出:

diff1 = 11
diff2 = 4294967051
diff3 = 4294967051

我会怀疑 diff3将具有与 diff1 相同的行为, 但它实际上与 diff2 相同.

那么为什么会这样呢?据我所知,编译器应该减去两个 8 位值,然后转换为 32 位值,但事实显然不是这样。这与 static_cast 的规范有关吗?对表达式的行为?

最佳答案

对于大多数算术运算符(包括 -),操作数会进行通常的算术转换。其中一个转换是将类型比 int 窄的任何值提升为 int。 (标准引用:[expr]/10)。

所以表达式 foo - bar 变成 (int)foo - (int)bar 给出 (int)-245。然后将其转换为 uint32_t,这将给出一个大的正数。

要获得您想要的结果,请转换为 uint8_t 而不是 uint32_t。或者,对转换为 uint32_t 的结果使用模数运算符 %

无法以比 int 更窄的精度直接进行计算

关于c++ - 为什么 static_cast 对表达式进行分配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27931157/

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