C++ 转换位宽和有符号/无符号,首先执行哪个转换?

C++ 转换位宽和有符号/无符号,首先执行哪个转换?,c++,casting,int,C++,Casting,Int,考虑以下代码: int32_t x = -2; cout << uint64_t(x) << endl; int32_t x=-2; cout您正在寻找标准第4.7节。特别是,第2段说: 如果目标类型是无符号的,则结果值是与源整数全等的最小无符号整数(模2n,其中n是用于表示无符号类型的位数) 在给定的示例中,我们得到了18446744073709551614=-2 mod 264。正如@aschepler所说,标准4.7§2(整数转换)确保结果与源一致的无符号整数最少

考虑以下代码:

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

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

如果目标类型是无符号的,则结果值是与源整数全等的最小无符号整数(模2n,其中n是用于表示无符号类型的位数)


在给定的示例中,我们得到了18446744073709551614=-2 mod 264。

正如@aschepler所说,标准4.7§2(整数转换)确保结果与源一致的无符号整数最少 整数(模2n,其中n是用于表示无符号类型的位数)

所以在您的例子中,它将是0xFFFFFFFFFFFE==18446744073709551614

但这是标准规定的一步转换(编译器实际执行的操作超出范围)

如果要先将无符号转换为uint32\u t,然后再转换为uint64\u t,则必须指定两种转换:
static\u cast(static\u cast(-2))

根据4.7§2,第一个将给出0xFFFFFE=4294967294,但由于该数字已经是有效的uint64,因此第二次转换时该数字不变


您观察到的内容是标准要求的,并且在任何符合标准的编译器上都可以观察到(前提是定义了
uint32_t
uint64_t
,因为这部分不是必需的…

解释没有变化,这是一个值转换。C和C++的值是一致的。一般来说,<代码> -3 < /C>和<代码>(未签名int)-3 < /Cord>可能有不同的表示。然而,在大多数情况下,计算都使用2的补码,因为它们具有相同的表示形式很方便。
int32_t x = -2;
cout << uint64_t(int64_t(x)) << endl;
int32_t x = -2;
cout << uint64_t(uint32_t(x)) << endl;