右移运算符对符号类型的编译器依赖性 :

标签 c bit-manipulation signed octal

在下面的代码中,

#include <stdio.h>
#include<conio.h>
main()
{
    int y=-01;
    y<<=3;
    printf("%d\n",y);
    y>>=3;
    printf("%d",y);
    getch();
}

我在一本书中读到,在 y 上使用右移运算符时,有符号位可能会保留也可能不会保留,具体取决于我的编译器。这是为什么?这背后的概念是什么?请详细说明。

最佳答案

有些处理器只有“无符号”右移(用 0 填充符号位)或有符号右移(用当前符号位的副本填充大小位)。由于某些处理器只有一个或另一个,而不是两个,因此该标准不会尝试强制执行一种行为或另一种行为。

就其值(value)而言,许多(大多数?)当前的处理器都有执行这两项操作的指令。例如,x86 包括 shr​​(逻辑右移——用 0 填充)和 sar(算术右移——用符号位的副本填充)。

关于右移运算符对符号类型的编译器依赖性 :,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18492653/

相关文章:

c++ - 签名到未签名的类型转换

android - 无法将已签名的 APK 上传到 PlayStore

java.lang.SecurityException : Invalid signature file digest for Manifest main attributes, 但 jar 未签名

c - 库函数返回的变量的内存分配位置

c - getchar() 和 putchar()

PHP if语句题(&运算符)

objective-c - 使用位操作设置一些标志的最佳实践

c - 为什么当变量被替换为它正在计算的内容时,这个表达式的输出是不同的?

c++ - 由于早期版本的先前安装,Makefile无法安装代码

c# - 如何检测位图中的直线/曲线? ( C# )