c++ - 将负数分配给 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
存储负数?
它没有。相反,它存储一个可表示的数字,该数字与该负数模所有可表示值的数量一致。对于大于最大可表示值的结果也是如此。
是保存使用还是会产生未定义的行为?
没有UB。无符号算术溢出定义明确。
依靠结果是安全的。但是,它可能很脆。例如,如果您添加-22u
and 100ull
,那么您会得到UINT_MAX + 79
(即一个较大的值,假设unsigned long long
类型大于unsigned
),它与 78 模一致UINT_MAX + 1
,可在 中表示unsigned long long
但在 中不可表示unsigned
。
请注意,有符号算术溢出是未定义的。
推荐阅读
- reactjs - How to intercept message from Chatbot in a React component ? (Microsoft botframework-webchat)
- python - SSD和SSD Lite有什么区别??(Tensorflow)
- c - 矩阵的第一个索引被忽略
- python-3.x - 通过 EC2 进行 S3 身份验证,无需在代码或存储中传递 AWS 访问密钥和密钥
- javascript - 通过单击图像将文本插入输入字段
- swift - 只有一个 Swift 按钮 = 致命错误:在展开可选值时意外发现 nil
- r - 使用 R 中的 Plot 减小图例的字体大小并移动到左下角?
- java - 使用 FCM 和 Java Web API 反应原生推送通知?
- ios - iOS - 同步 Web 和应用订阅
- angular - 仅在经过身份验证时才显示primeng menuitem