c - 奇怪的右位移不一致
问题描述
我一直在使用 C 中的位(在 ubuntu 上运行)。在使用两种不同的方法来右移一个整数时,我得到了奇怪的不同输出:
#include <stdio.h>
int main(){
int x = 0xfffffffe;
int a = x >> 16;
int b = 0xfffffffe >> 16;
printf("%X\n%X\n", a, b);
return 0;
}
我认为每个输出都是相同的:FFFF,因为正确的四个十六进制位置(16 位)被右移了。相反,输出是:
FFFFFFFF
FFFF
什么解释了这种行为?
解决方案
当你说:
int x = 0xfffffffe;
设置为 -2 因为这里可以容纳x
的最大值是并且它在转换过程中环绕。当您对负数进行位移时,它会变得很奇怪。int
0x7FFFFFFF
如果您将这些值更改为unsigned int
一切正常。
#include <stdio.h>
int main(){
unsigned int x = 0xfffffffe;
unsigned int a = x >> 16;
unsigned int b = 0xfffffffe >> 16;
printf("%X\n%X\n", a, b);
return 0;
}
推荐阅读
- javascript - 未捕获的类型错误:无法读取 jquery 中未定义的属性“SPAN_ID”
- c++ - ProtoBuf:如何为新消息重用 FieldDescriptor?如何有效地从动态消息中获取字段值?
- fortran - LAPACK DGETRF+DGETRI 失败
- sql - SQL - 每 00 小时重置一次序列
- linux - vscode python调试器不工作:连接被拒绝
- youtube-api - 无法从此频道“UCDtoxgCJVoKp_ImQqWTuUpw”获取视频
- flutter - 颤动:失败的断言下拉
- maven - 跳过根 pom 的插件执行
- java - 从 SpringBoot Java 中的其他私有方法中的私有方法中的变量获取信息
- python - Python 请求无效消息