在C中,移位运算符(<<,>>)是算术还是逻辑?
关于负数的右移操作我很困惑,这里是代码.
int n = -15;
System.out.println(Integer.toBinaryString(n));
int mask = n >> 31;
System.out.println(Integer.toBinaryString(mask));
Run Code Online (Sandbox Code Playgroud)
结果是:
11111111111111111111111111110001
11111111111111111111111111111111
Run Code Online (Sandbox Code Playgroud)
为什么要将负数移31而不是1(符号位)?
java bit-manipulation bit-shift bitwise-operators negative-number
我想要得到的价值INT_MIN和INT_MAX,和我试过~0和~0 >> 1,因为最左边的位为符号位.我得到了他们两个-1.
它太混乱了,为什么不~0成为0xffffffff和~0 >> 1将来0x7fffffff?
在此问答后,我试着检查答案,所以我写道:
#include <stdio.h>
int main ()
{
int t;int i;
for (i=120;i<140;i++){
t = (i - 128) >> 31;
printf ("t = %X , i-128 = %X , ~t & i = %X , ~t = %X \n", t, i-128 , (~t &i), ~t);
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出是:
t = FFFFFFFF , i-128 = FFFFFFF8 , ~t & i = 0 , ~t = 0
t = FFFFFFFF , i-128 = FFFFFFF9 , ~t & i = …Run Code Online (Sandbox Code Playgroud) (unsigned)~0和之间有什么区别(unsigned)1.为什么是unsigned的~0IS -1和unsigned的1是 1?它是否与无符号数存储在内存中的方式有关.为什么无符号数字会给出签名结果.它也没有给出任何溢出错误.我正在使用 GCC编译器:
#include<sdio.h>
main()
{
unsigned int x=(unsigned)~0;
unsigned int y=(unsigned)1;
printf("%d\n",x); //prints -1
printf("%d\n",y); //prints 1
}
Run Code Online (Sandbox Code Playgroud)