SO是一场狗屎秀。感谢您的搭车。
来自 C++11 标准,4.7“积分转换”,第 2 段:
如果目标类型是无符号的,则结果值是最小的 与源整数全等的无符号整数(模 2n,其中 n 是用于表示无符号类型的位数)。
换句话说,当转换为无符号整数时,只有输入的值重要,而不是其类型。将 -1 转换为 n 位无符号整数总是会得到 2n-1,无论 -1 开始时是哪种整数类型。
这是一个很好的问题,本节的C++标准草案
4.7
如果目标类型是无符号的,则结果值是与源整数一致的最小无符号整数(模 2n,其中 n 是用于表示无符号类型的位数)。[...]
不是最直接的解释,在这种情况下,我会回到C99标准草案,其中写道:
否则,如果新类型是无符号的,则通过重复添加或来转换值 比新类型可以表示的最大值减一 直到该值在新类型的范围内。49
其中脚注
49
规则描述了数学值的算术,而不是给定类型表达式的值。
这更直接,并且清楚地给我们结果为
-1 + MAX + 1
MAX