将负整数强制转换为更大的无符号整数
Casting negative integer to larger unsigned integer
我遇到了执行以下转换的代码:
static_cast<unsigned long>(-1)
据我所知,C++标准定义了将有符号整数值转换为无符号整数类型时会发生什么(请参阅:如果将负值赋给无符号变量会发生什么?)。
我在上面的代码中担心的是,源类型和目标类型的大小可能不同,以及这是否会对结果产生影响。编译器会在强制转换之前放大源值类型吗?它会转换为相同大小的无符号整数,然后放大吗?或者其他什么?
为了用代码澄清,
int nInt = -1;
long nLong = -1; // assume sizeof(long) > sizeof(int)
unsigned long res1 = static_cast<unsigned long>(nInt)
unsigned long res2 = static_cast<unsigned long>(nLong);
assert(res1 == res2); // ???
基本上,我应该担心写这样的代码吗
static_cast<unsigned long>(-1L)
超过
static_cast<unsigned long>(-1)
根据C++11标准,4.7"积分转换",第2段:
如果目标类型是无符号的,则结果值最小与源整数全等的无符号整数(模2n,其中n是用于表示无符号类型的位数)。
换句话说,当转换为无符号整数时,只有输入的值才重要,而不是它的类型。将-1转换为n位无符号整数将始终为2n-1,无论-1以哪种整数类型开始。
这是一个很好的问题,本节的C++标准草案4.7
积分转换说:
如果目标类型是无符号的,则得到的值是与源整数全等的最小无符号整数(模2n,其中n是用于表示无符号类型的位数)。[…]
不是最直接的解释,在这种情况下,我会回到C99标准草案,它说:
否则,如果新类型是无符号的,则通过重复添加或比新类型中可以表示的最大值多减去一直到该值在新类型的范围内49
其中脚注49
有助于说明:
规则描述的是数学值的算术运算,而不是给定类型表达式的值。
这更直接,并且清楚地将结果作为-1 + MAX + 1
,即MAX
,而不管操作数是什么类型。
相关文章:
- 从 std::string 转换为 const 无符号整数
- 在C++中,将无符号整数转换为八进制表示,反之亦然的最佳方法是什么
- 将二进制编码的无符号字符转换为整数
- 如何将以"\0"开头的字符 * 转换为无符号整数?
- 为什么C++标准指定有符号整数在具有混合符号的二进制操作中强制转换为无符号整数
- g++ 在不使用 -Wconvert 的情况下将 double/float 转换为无符号整数时发出警告
- 有符号整数和无符号整数之间的转换
- 将负整数强制转换为更大的无符号整数
- 在Python中获取从有符号整数到无符号整数的转换
- 从双精度到无符号整数的转换
- 正在尝试读取4字节无符号整数的二进制文件并转换为伏特
- 如果我有一个固定大小的填充ascii数字的char数组,我知道它指的是一个无符号整数,那么将其转换为无符号整数的最快方法
- 将浮点数 32 位变量类型转换为无符号整数 32 位时进行了哪些位级更改
- 如果使用无符号整数,则通过减去1将基于1的编号转换为基于0的编号是否安全
- 将字节转换为无符号整数的最快方法
- 将浮点转换为无符号整数c++
- 将4个字节按小端序转换为无符号整数
- 正在将char转换为无符号整数
- 将无符号整数转换为无符号char*
- 将MFC CString转换为无符号整数