此代码给出了有意义的输出
#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
答案 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.
技术上有效,编程错误。