片段中的差异
Discrepancy in Snippet
本文关键字:片段 更新时间:2023-10-16
虽然下面的两个代码片段在find变量的操作上略有不同,但输出似乎是相同的。为什么如此?
第一个代码段
#include<iostream>
using namespace std;
int main()
{
int number = 3,find;
find = number << 31;
find *= -1;
cout << find;
return 0;
}
<<p> 第二片段/strong> #include<iostream>
using namespace std;
int main()
{
int number = 3,find;
find = number << 31;
find *= 1;
cout << find;
return 0;
}
两个片段的输出:
-2147483648
(根据Ideone: 1,2)
在您的两个样本中,假设32位int
s,您正在调用未定义行为,正如在左侧操作数具有负值时为什么左移位操作调用未定义行为中所指出的那样?
为什么?因为number
是带符号的int
,具有32位存储空间。(3<<31)
在该类型中不可表示。
一旦进入未定义行为区域,编译器就可以为所欲为。
(您不能依赖以下任何内容,因为它是UB -这只是对编译器似乎正在做的事情的观察)。
在这种情况下,看起来编译器正在做正确的移动,导致0x80000000
作为二进制表示。这恰好是INT_MIN
的两个补表示。所以第二个代码片段并不奇怪。
为什么第一个输出相同的东西?在2的补码中,MIN_INT将是-2^31
。但最大值是2^31-1
。MIN_INT * -1
将是2^31
(如果它是可表示的)。猜猜它的表示是什么?0x80000000
。回到你开始的地方!
相关文章:
- 这个带有模板<类 Vector 的C++代码片段有什么问题>
- Opengl 3.1 GLSL 140 在 C++ 年输出白色在片段着色器中
- 这两个代码片段相似,但显示的结果不同
- 如何替换此示例代码片段中已弃用的handler_type_t或 boost::asio::handler_type?
- 我需要解释给定片段的输出
- 如果我在下面的代码片段中添加"delete[] d;",为什么我得到零?
- 我遇到了这个代码片段,不明白. 它递归检查 C++ 字符串中是否存在大写字符
- 任何人都可以解释一下我是否需要 & 在第一个代码片段中
- OpenGL 片段着色器未在英特尔 HD 4000 显卡上编译
- 帧缓冲纹理变为白色(片段着色器不会影响它)
- 如何在 c++ 中检查连续片段中数字被 11 整除
- 提取狮身人面像文档中的C++代码片段
- 为什么此代码片段有效?如何取消引用空点?
- 将顶点位置从顶点传递到片段着色器 - 仅在使用 Nsight 进行调试时有效
- 无法在这个基本的Qt代码片段中找到错误,但我被告知它肯定存在?
- 使用片段着色器写入 1D 纹理后从 1D 纹理读回不起作用
- 如何在顶点着色器中使用VBO数据作为位置数据,在片段着色器中使用统一数据作为颜色数据
- 这个代码片段中会发生死锁吗?为什么
- 同时与两个片段着色器发生碰撞
- 这个片段中关于 n 在 pc[i] 中的表示发生了什么