将负数分配给未签名的INT
Assign a negative number to an unsigned int
此代码给出了有意义的输出
#include <iostream>
int main() {
unsigned int ui = 100;
unsigned int negative_ui = -22u;
std::cout << ui + negative_ui << std::endl;
}
输出:
78
变量negative_ui
存储-22
,但是unsigned int
。我的问题是unsigned int negative_ui = -22u;
为什么工作。unsigned int
如何存储负数?是否保存用于使用,还是产生未定义的行为?
我使用英特尔编译器18.0.3。使用选项-Wall
没有发生警告。
ps。我已经阅读了如果我为无符号变量分配负值会发生什么?以及为什么未签名的int包含负数
unsigned int
如何存储负数?
不是。取而代之的是,它存储了一个与负数模拟所有代表值的数字相一致的可代表数字。比最大的代表值大的结果也是如此。
是否可以保存使用或产生未定义的行为?
没有UB。 un 签名的算术溢出已很好地定义。
依靠结果是安全的。但是,这可能很脆弱。例如,如果添加-22u
和100ull
,则获得UINT_MAX + 79
(即,假设unsigned long long
比unsigned
更大的型号的大值(与78 Modulo UINT_MAX + 1
一致,在unsigned long long
中可表示,但在unsigned
中不可用,但
请注意,签名算术溢出是 undefined。
签名/unsigned是约定。它使用变量的最后位(如果x86 int,最后31位(。您存储在变量中的内容需要全位长度。
是随后的计算将上钻头作为符号指示器或忽略它。因此,任何"无符号"变量都可以包含一个签名值,该值将在无符号变量参与计算时将转换为无符号形式。
unsigned int x = -1; // x is now 0xFFFFFFFF.
x -= 1; // x is now 0xFFFFFFFE.
if (x < 0) // false. x is compared as 0xFFFFFFFE.
int x = -1; // x stored as 0xFFFFFFFF
x -= 1; // x stored as 0xFFFFFFFE
if (x < 0) // true, x is compared as -2.
技术上有效,不良编程。
相关文章:
- 如何为地图< map<int,int> 、bool > 分配值?
- 是否需要动态分配单个 int?
- 这行代码中的内存是如何分配"int **v = new int*[n]; "的?
- 将 static_cast<int>(-15) 分配给静态常量字符类型变量
- 类型别名允许分配任意指针,尽管 int* 是必需的
- 为什么我不能将 int 分配给结构成员的联合成员?
- C++程序无法分配 int 数组?
- 尝试使用 Array 类的模板构造整数数组时,错误:为什么数组类型"int [5]"不可分配,
- 如何正确分配动态创建int并将其分配给具有值的动态数组数组
- 使用 cudaMalloc() 在使用 std::vector<int *时进行分配>
- C ++中新分配的int的内存大小,有没有不同更好的方法来查看它?
- 只读位置'__result.std::_Rb_tree_const_iterator<_Tp>::operator*<long long int>()'分配错误
- 为什么这个指针到指针的二维数组像这样分配新的 int
- 将负数分配给未签名的INT
- 不能将 "const char*" 类型的值分配给类型 "int" 的实体
- 如果我将无符号 int 分配给有符号的 int,是否可以有单位化位
- CPP 将 int 分配给字符串恶作剧
- 将 int 分配给三元运算的布尔值
- 从不兼容的类型'int'分配给 [自定义 typdef]
- 将矢量<int>分配给矢量是否安全<double>?