c++中加法符号的变化
change of sign of an addition in c++
我对C++很陌生,当我试图用蛮力做一些事情时,在添加一些正整数时,我注意到在某个时刻总和变为负。
通过仔细观察,我注意到将2147483647与1相加会返回-2147483648。
有人知道为什么会出现这个标志吗?
这是众所周知的,称为Integer溢出。
有符号整数的最大值(2147483647
)不能超过。
超过它将导致环回到它的最小值-2147483648
。
它与记忆的工作方式密切相关。
有关整数溢出的更多信息。
从历史上看,这是因为在普通CPU上,发出硬件增量指令会导致您看到的行为。
在C中,以及在C++11之前的C++中,这实际上是未定义的行为。gcc -O3
的最新版本可以基于未定义的该操作来执行优化(例如,在发生该操作的地方切除流分支)。
但是,由于C++11,所以有一个名为std::numeric_limits<int>::is_modulo
的bool
可以检查。如果这是false
,那么您的代码是未定义的行为,但如果是true
,那么它被定义为执行您正在设置的内容。
相关文章:
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 有符号的int和int-有没有一种方法可以在C++中区分它们
- 将无符号char*转换为std::istream*C++
- 如何在C++中将一个无符号的 int 转换为两个无符号的短裤?
- vscode g++链路故障:体系结构x86_64的未定义符号
- C++取消引用指针.为什么会发生变化
- 为什么在读取文件大小时文件IO速度会发生变化
- 从矢量<无符号字符>转换为字符* 包括垃圾数据
- 如何理解将半精度指针转换为无符号长指针和相关的内存对齐
- Visual studio代码重构似乎不起作用(例如,重命名符号-f2)
- 使用gcc从静态链接的文件中查找可选符号
- C++中无符号字符溢出
- 使用无符号字符数组有效存储内存
- C++:Application.cpp中抛出了未解析的外部符号(解决方案在问题的末尾,供未来的读者参考)
- VC++本机单元测试,找不到调试符号
- 创建集合成员(C )成员的每个置换和符号变化的集合
- "signbit"与乘法检测到的符号变化,并将其与零进行比较
- c++中加法符号的变化
- 处理c++角度中的符号变化
- 查找数组中数字符号的变化量