c++ - C++ 无符号和有符号转换
问题描述
我以前见过这种问题,但提供的答案并不能为我解决所有问题。发布此问题时,通常会附有下一个示例:
#include <iostream>
int main()
{
unsigned int u = 10;
int i = -42;
std::cout << i + i << std::endl;
std::cout << i + u << std::endl;
return 0;
}
输出:
-84
4294967264
所有按预期工作的 int 都转换为无符号数。但是,如果 的绝对值i
小于,u
则似乎没有发生这种转换。
#include <iostream>
int main()
{
unsigned int u = 10;
int i = -3;
std::cout << i + i << std::endl;
std::cout << i + u << std::endl;
return 0;
}
输出:
-6
7
我没有看到任何提到它的答案,也找不到任何解释。尽管这似乎是合乎逻辑的事情发生,但我没有任何解释可以解释这一点。
解决方案
后:
unsigned int u = 10;
int i = -3;
i + u
通过首先转换i
为 来评估收益unsigned int
。对于 32-bit unsigned int
,此转换包含模 2 32,即 4,294,967,296。这种包装的结果是 -3 + 4,294,967,296 = 4,294,967,293。
转换后,我们添加 4,294,967,293(已转换i
)和 10(u
)。这将是 4,294,967,303。由于这超出了 32-bit 的范围unsigned int
,因此以 4,294,967,296 为模包装。结果是 4,294,967,303 - 4,294,967,296 = 7。
因此打印“7”。
推荐阅读
- image - JMeter - 从数据文件中读取图像以进行 PUT 请求
- ethereum - Nethereum 异常:“在 JSON 中找不到必需的属性‘代码’。”
- nsis - NSIS反模拟器
- r - 如何使用ggplot在R中沿x轴填充缺失的时间戳值?
- node.js - 将 AppSync 和 Amazon RDS 与 serverless-graphql 一起使用
- c++ - C++ - 候选函数不可行:没有已知的从 'struct' 到 'struct (&)' 的转换
- javascript - 需要带条件继续的循环
- hadoop - 如何在 HDFS 文件中搜索
- python - 如何解决 Python 中的 StopIteration 错误?
- terraform - 使用 Terraform 进行高效的变量验证