为未签名的int分配一个负数

时间:2019-05-21 11:17:30

标签: c++ unsigned-integer

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

#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如何存储负数?是否节省使用或产生不确定的行为?

我使用的是Intel编译器18.0.3。使用选项-Wall不会发生警告。

Ps。我已阅读What happens if I assign a negative value to an unsigned variable?Why unsigned int contained negative number

2 个答案:

答案 0 :(得分:8)

  

public IEnumerable<LoadTable> TableList; TableList = _context.LoadTable.Where(o => o.Approver == GetADDetails.displayName || o.Approver == GetADDetails.userName).Distinct().ToList(); 如何存储负数?

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

  

是否可以保存使用还是会产生不确定的行为?

没有UB。明确定义了 Un 签名的算术溢出。

依靠结果是安全的。但是,它可能很脆弱。例如,如果您添加unsigned int-22u,则会得到100ull(即,假设UINT_MAX + 79是比unsigned long long大的类型,则为大值)与unsigned中可表示但在UINT_MAX + 1中不可表示的78模数unsigned long long相同。

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

答案 1 :(得分:1)

签名/未签名是约定。它使用变量的最后一位(如果是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.

技术上有效,编程错误。