首页 > 解决方案 > 将负数分配给 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不会出现警告。

附言。我已阅读如果我为无符号变量分配负值会发生什么?以及为什么 unsigned int 包含负数

标签: c++unsigned-integer

解决方案


如何unsigned int存储负数?

它没有。相反,它存储一个可表示的数字,该数字与该负数模所有可表示值的数量一致。对于大于最大可表示值的结果也是如此。

是保存使用还是会产生未定义的行为?

没有UB。符号算术溢出定义明确。

依靠结果是安全的。但是,它可能很脆。例如,如果您添加-22uand 100ull,那么您会得到UINT_MAX + 79(即一个较大的值,假设unsigned long long类型大于unsigned),它与 78 模一致UINT_MAX + 1,可在 中表示unsigned long long但在 中不可表示unsigned

请注意,有符号算术溢出未定义的。


推荐阅读