如何防止算术左移(ASL)中的符号丢失

时间:2014-03-04 18:48:04

标签: math bit-manipulation bit-shift

在算术右移(ASR)期间,MSB被复制到左侧,因此符号保持不变 - 这很清楚。然而,在算术左移(ASL)中,符号可能在某些情况下丢失,例如

01001001 << 1 = 10010010

由于MSB为0,原始数字明显为正,但由于MSB为1,因此移位数为负数。您能解释一下为什么会这样吗?

3 个答案:

答案 0 :(得分:0)

与右移不同,没有真正的“算术左移”与“逻辑左移”形成鲜明对比,只有一种左移,它会丢弃符号。

真的,它没有别的办法。那些左移改变符号的情况恰恰是那些“实际结果”无法表达的情况。

答案 1 :(得分:0)

对于二进制补码二进制值,导致负值变为正的左移只是翻转条件。操作的结果是溢出。使用更大的整数类型。如果你使用的是一个补码表示,那么首先将其转换为二进制补码值,然后进行转换并将其转换回来。

答案 2 :(得分:0)

在“算术左移”中,使用有符号值(任何位值大小(8,16等)),这只是一个逻辑左移(乘以2),它会给你一个正确的结果除了MSB更改(1 => 0或0 => 1)之外,它是溢出(/下溢)或错误(未定义结果)条件。

有些处理器有一个溢出或错误标志,可供您测试,否则您必须自己以编程方式进行测试。

对于无符号值,只要在移位后设置进位位,就会出现溢出。 (小心任何不移入进位的左移位指令只是放弃MSB)