c++ - 为什么负 size_t 下溢但减去它却没有?
问题描述
我在这里有一个简单的程序,它返回 18446744073709551615:
#include <iostream>
using namespace std;
int main()
{
cout<<-(size_t)1;
cout<<0-(size_t)1;
return 0;
}
另外,我这里也有这个程序,它返回预期的结果 0:
#include <iostream>
using namespace std;
int main()
{
cout<<1-(size_t)1;
return 0;
}
有人可以向我解释这里发生了什么吗?如果-(size_t)1
和0-(size_t)1
都下溢,为什么1-(size_t)1
很好?
解决方案
为什么 1-(size_t)1 很好?
因为不会溢出。1 可表示为std::size_t
,减法结果为 0 也是可表示的。
所以不应该 -(size_t)1 评估为大数字
正如您在第一个示例中使用一元减号运算符时所发现的那样。但是您在第二个示例中没有使用一元减号运算符。您使用了二进制减号运算符。
那么它会变成1+大数吗?
减法不会“变成”加法。
也就是说,你会发现它 1 + std::size_t(-1)
也是 0。这是因为无符号算术是模块化的。-1 与某个大值一致,而那个大值 + 1 与 0 一致。模算术的这种特性被称为“与平移的兼容性”。
推荐阅读
- sql-server - Hibernate 一对多准备好的语句非常慢
- c++ - 最后打印所有类实例方法的打印语句?
- python - 有没有办法说“如果有什么==什么”?(Python)
- audio - FFMPEG:无法从 RTSP 摄像机 IP:V380 Pro 获取音频流
- python - 拆分字符串,中间有 2 个空格
- matlab - 以下代码的矢量化有什么好处吗?
- regex - 自定义 grok 模式 - 匹配多个模式
- javascript - JavaScript Object Literal - 数据操作
- angular - Angular 7 项目的报告工具比较
- c++ - Boost TCP Server 未读取所有传入数据