gpt4 book ai didi

c++ - 同时转换位宽和有符号/无符号,首先执行哪个转换?

转载 作者:太空狗 更新时间:2023-10-29 21:39:59 24 4
gpt4 key购买 nike

考虑以下代码:

int32_t x = -2;
cout << uint64_t(x) << endl;

第二行中的转换基本上包含两个原子步骤。位宽从 32 位增加到 64 位,解释从有符号变为无符号。如果用 g++ 编译并执行,则得到 18446744073709551614。这表明首先处理位宽的增加(作为有符号扩展),然后处理有符号/无符号解释的变化,即上面的代码等同于编写:

int32_t x = -2;
cout << uint64_t(int64_t(x)) << endl;

让我感到困惑的是,人们还可以先将 x 解释为无符号的 32 位位 vector ,然后将其零扩展为 64 位,即

int32_t x = -2;
cout << uint64_t(uint32_t(x)) << endl;

这将产生 4294967294。有人可以确认 g++ 的行为是标准所要求的并且没有定义实现吗?如果您能向我推荐标准中实际涉及手头问题的规范,我将非常兴奋。我尝试这样做但惨遭失败。

提前致谢!

最佳答案

您正在寻找标准第 4.7 节。特别是,第 2 段说:

If the destination type is unsigned, the resulting value is the least unsigned integer congruent to the source integer (modulo 2n where n is the number of bits used to represent the unsigned type).

在给定的示例中,我们有 18446744073709551614 = -2 mod 264

关于c++ - 同时转换位宽和有符号/无符号,首先执行哪个转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31677864/

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