这个逻辑给出了: -
if v < 0 then -1,
else +1
sign = +1 | (v >> (sizeof(int) * CHAR_BIT - 1))
对于v&gt; = 0,它非常清楚, 但在负整数的情况下,我正在修复。
让我们举一个-1
(1111 1111)的例子: -
假设: - int
需要两个字节
CHAR_BIT
(每个字节代表的位数不是): - 8
在右移操作之后我们会:
sign = 0000 0001 | 0000 0001
那怎么会是-1
答案 0 :(得分:1)
有两种类型的位移:logical shift和arithmetic shift。假设int
是4个字节,哪一个是(-1) >> 31
?
在C / C ++中,当操作数是带符号的类型并且具有负值时,结果是实现定义的。
实际上,在大多数机器上,它是算术移位,这意味着(-1) >> 31
结果为-1
,但从技术上讲,结果取决于实现。