作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试创建一个掩码,但是当我计算 shift 的值并将其放入变量中时,我得到了错误的结果。看:
#include <stdio.h>
int main(){
int shift = 32 ;
printf("%d\n",shift); //32
int mask = 0xFFFFFFFF << shift;
printf("%x\n",mask); //ffffffff
mask = 0xFFFFFFFF << 32;
printf("%x\n",mask); //00000000
return 0;
}
有人知道为什么会发生这种情况吗?
最佳答案
如果您的系统有 32 位或更小的 int
,那么您会导致 undefined behaviour通过移位 32 位或更多。移位的位数必须少于类型的位数。
如果你有 64 位 int,那么 0xFFFFFFFF
将是一个有符号 int,将其移位 32 位会将 1
移动到符号位,这会导致 UB在 C 中,以及在 C++14 之前的 C++ 中。 (从 C++14 开始,这会导致实现定义的行为)。
printf("%x\n",mask);
也会触发 UB,因为 %x
需要非负值,但您将传递负 int
。为了避免这种情况,请改用unsigned int mask
。
当你触发UB时,任何事情都可能发生,包括但不限于无意义的输出,以及相同的操作给出不同的结果。
关于c++ - 左移带有可变误差,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30677965/
我正在做一个项目,我的 android 在这个项目中作为一个网络服务器工作;输入带端口号的 IP 地址,打开 Web 界面,用户可以将文件上传到手机。我想在 Web 界面上显示一些图片,以便我们的界面
我是一名优秀的程序员,十分优秀!