我有一个__int64变量x = 0x8000000000000000。
我尝试将其按字节向右移位:x >> 4
Ive thought that the result should be0x0800000000000000, but unfortunately I get0xf800000000000000`.
我使用VS10。为甚麽呢?我该如何解决这个问题呢?
我对负数的右移操作很困惑,这是代码。
int n = -15;
System.out.println(Integer.toBinaryString(n));
int mask = n >> 31;
System.out.println(Integer.toBinaryString(mask));
结果是:
11111111111111111111111111110001
11111111111111111111111111111111
为什么要将负数右移31而不是1(符号位)?
我一直在使用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
是什么解释了这种行为?
根据文本:“在很少的C/C++编译器不对负数的右移位执行符号扩展的情况下,右移除数的技巧失败”。
请考虑以下示例:
unsigned int i = 0b10000000; // 128
i = i >> 1; // i equals 01000000 i.e. 64
这是我唯一知道的阻止符号扩展的方法。此外,通过添加无符号,它成为一个正数,所以请更正。
为什么我没有收到警告
不允许负数的移位
当我使用以下代码时:
#include <stdio.h>
int main (){
int k = -5;
unsigned int shift = 2;
unsigned ans = (k >> shift);
printf("ans:%u\n",ans);
return 0;
}
GCC版5.4.0 Ubuntu 16.04
当我在变量中存储一个值时,我注意到了C中右移的一些奇怪的行为。
此代码段正在打印0xf0000000,这是预期的行为。
int main() {
int x = 0x80000000
printf("%x", x >> 3);
}
下面两个代码片段正在打印0x10000000,在我看来,这是非常奇怪的,它正在对负数执行逻辑转换。
1.
int main() {
int x = 0x80000000 >> 3
printf("%x", x);
}
2.
int m
在Verilog中%操作符的范围是多少?在C中,我知道如果我写数字%10,那么输出在0到9之间。但是我尝试了Verilog,结果是-9到9之间?为什么会这样呢?
enter code here
module testbench;
integer i;
reg signed [15:0] a,b;
initial
begin
for(i = 0; i < 9; i = i + 1)
begin
a= $random%10;
b= $random%20;
$display("A: %d and B : %d",a,b);
end
end
endmo