将负整数转换为更大的无符号整数

问题描述 投票:0回答:2

SO是一场狗屎秀。感谢您的搭车。

c++ casting size
2个回答
22
投票

来自 C++11 标准,4.7“积分转换”,第 2 段:

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

换句话说,当转换为无符号整数时,只有输入的值重要,而不是其类型。将 -1 转换为 n 位无符号整数总是会得到 2n-1,无论 -1 开始时是哪种整数类型。


10
投票

这是一个很好的问题,本节的C++标准草案

4.7
积分转换说:

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

不是最直接的解释,在这种情况下,我会回到C99标准草案,其中写道:

否则,如果新类型是无符号的,则通过重复添加或来转换值 比新类型可以表示的最大值减一 直到该值在新类型的范围内。49

其中脚注

49
很有帮助地说:

规则描述了数学值的算术,而不是给定类型表达式的值。

这更直接,并且清楚地给我们结果为

-1 + MAX + 1
,即
MAX
,无论操作数是什么类型。

© www.soinside.com 2019 - 2024. All rights reserved.