Binary 左移操作,带';补码二进制

Binary 左移操作,带';补码二进制,binary,bitwise-operators,bit-shift,negative-number,ones-complement,Binary,Bitwise Operators,Bit Shift,Negative Number,Ones Complement,我在研究按位运算和有符号数表示​. 我已经认识到,如果我们在补体模式上左移。它不能正确地与原始数字相乘 例如(补语): 11100101(-26)在二的补码中,负数a由正数2n-| a |编码,可以通过-2n-1×an-1+∑0n-2 2i×ai很容易证明,如果没有溢出(即仅0或仅1被移出),将该值左移k位将得到A×2k的代码 在1的补码中,负数a由(a的2的补码)-1编码。其值为-2n-1×an-1+∑0n-2 2i×ai-1。如果我们将其左移k,结果的数值是(2k*A的2的补码)-2k*1(

我在研究按位运算和有符号数表示​. 我已经认识到,如果我们在补体模式上左移。它不能正确地与原始数字相乘

例如(补语):


11100101(-26)在二的补码中,负数a由正数2n-| a |编码,可以通过-2n-1×an-1+∑0n-2 2i×ai很容易证明,如果没有溢出(即仅0或仅1被移出),将该值左移k位将得到A×2k的代码

在1的补码中,负数a由(a的2的补码)-1编码。其值为-2n-1×an-1+∑0n-2 2i×ai-1。如果我们将其左移k,结果的数值是(2k*A的2的补码)-2k*1(前提是没有溢出)。它与预期结果(2的2k*A的补码)-1不同2k-1

我们可以通过您的示例进行验证:


C1(-26)在二的补码中,负数a由正数2n-| a |编码,可以通过-2n-1×an-1+找到其值∑0n-2 2i×ai很容易证明,如果没有溢出(即仅0或仅1被移出),将该值左移k位将得到A×2k的代码

在1的补码中,负数a由(a的2的补码)-1编码。其值为-2n-1×an-1+∑0n-2 2i×ai-1。如果我们将其左移k,结果的数值是(2k*A的2的补码)-2k*1(前提是没有溢出)。它与预期结果(2的2k*A的补码)-1不同2k-1

我们可以通过您的示例进行验证:


(26)在C和C++中,简单无所谓。如果你把Shift作为负数,这个行为是不确定的。谢谢,所以在C或C++中,它不支持左移位,负数,C和C++。如果你把移位负一个数,这个行为是不确定的。谢谢,所以在C或C++中,它不支持左移位,否定的数字,右谢谢你有用的解释,但是它可能是一个小的混淆,因为我知道一个补负数A被(2的补码A)-1编码(正如你所说的(2的补码A)+1)。没错,你是对的。一个通常的负数A实际上被编码成两个补码,即C2(A)=~A+1。一个补码是~A,因此是C2(A)-1。谢谢我澄清了答案。谢谢你有用的解释,但据我所知,一个人的补码负数a是由(2的a补码)-1编码的(正如你所说的(2的a补码)+1)。没错,你是对的。一个通常的负数A实际上被编码成两个补码,即C2(A)=~A+1。一个补码是~A,因此是C2(A)-1。谢谢我澄清了答案。
11100101 (-26) << 1 = 11001010 (-53)

11110100 (-11) << 2 = 11010000 (-47)