Problem:
Write 0b11001001 in decimal.
I tried the following:
110010012 = 1 + 8 + 64 + 128 = 201
but the answer is –55. Where am I going wrong?
如果基础数据类型是unsigned byte ,您的答案是正确的。如果类型是有符号字节,那么它的范围是 [-128..127]。你有 201超出范围[0..127],所以 201 应该被解释为负值。为了找出相应的负值,您应该将代码转换为所谓的补码表示:
http://en.wikipedia.org/wiki/Signed_number_representations
加 1
11001001 -> 00110110(反向)-> 00110111(增加一个)
0b00110111 是 1 + 2 + 4 + 16 + 32 = 55 十进制
所以有符号字节的答案是 -55
我假设这是一个家庭作业问题或测试问题?如果一串位表示一个整数,它可以被解释为有符号(在这种情况下,该值可以是正数、零或负数)或无符号(在这种情况下它只是正数或零)。
在本例中,您为一个八位字长的无符号整数提供了正确答案,但提问者正在寻找一个有符号整数的值。
有符号值通常使用称为二进制补码的方案表示,如下所述:
http://en.wikipedia.org/wiki/Two's_complement _
-55 是解释为二进制补码的二进制序列的值,假设字长为 8 位。
但是,还有其他用于以二进制编码负整数的方案,例如反码,它提供了不同的结果:
http://en.wikipedia.org/wiki/Ones '_complement
二进制补码通常是首选,因为零只有一种表示,而一个补码提供正零和负零表示。
无论如何,这个问题似乎依赖于隐含的、未说明的假设。