将负数分配给未签名的INT

Assign a negative number to an unsigned int

本文关键字:INT 分配      更新时间:2023-10-16

此代码给出了有意义的输出

#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 签名的算术溢出已很好地定义。

依靠结果是安全的。但是,这可能很脆弱。例如,如果添加-22u100ull,则获得UINT_MAX + 79(即,假设unsigned long longunsigned更大的型号的大值(与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.

技术上有效,不良编程。