如果我在16位系统上获得1101 0010 0010 0010并想将其转换为十进制,则结果为-11,742(老师告诉我)
但如果我在我的计算器中输入二进制数字,我会得到53794.
为什么会这样?系统(8位,16位,32位,64位)如何影响这个?
我试图用手转换二进制数(2 + 32 + 512 + 4096 + 16384 + 32768 = 53794),但只是为了确认我的计算器....
答案 0 :(得分:1)
基本上,它取决于有多少空间。最重要的位用于确定数字是否为负数。
在32位系统中,以下两个数字相同:
1101 0010 0010 0010
0000 0000 0000 0000 1101 0010 0010 0010
作为带符号的16位值,开头的1表示它是负数。要获取其值,请翻转每个位,然后添加一个。
1101 0010 0010 0010
0010 1101 1101 1101
0010 1101 1101 1110
= 11742
作为无符号 16位值,所有16位用于确定幅度。这将导致53794。
答案 1 :(得分:1)
这是因为计算机arhitmetic基于two's complement
您应该阅读method of colpement
例如,在补数十进制数中,自然减法看起来像(使用4位数):
0000
0001 -
9999 =
显然是-1,因为在补充系统的第一个数字(当然是大端,你应该熟悉endianness)定义符号。例如,在十进制补码4中是4,4是4,3是3,2是2,1是1,0是0,9是-1,8是-2,7是-3,6是-4和5是-5。
这是因为在补数系统中,您始终使用相同数量的数字,但除了忽略溢出结果外,您将一如既往地添加和减少。例如,有两位小数:
04
05 -
...9999 =
正如我所说的结果只有两位数(我们添加了两位数)所以结果是99.正如我之前提到的那样,第一个数字被解释为-1(不是9)。因为它是位置编号系统,所以我们可以很容易地将这个结果转换成我们的正常十进制系统,只需通过正确的十次幂来对多个数字进行求和:
10^1 * 9 + 10^0 * 9
//as I told - first nine is -1 so:
10^1 * -1 + 10^0*9 = -10 + 9 = -1
现在尝试第一个结果:
9999 = 9 * 10^3 + 10^2 * 9 + 10^1 * 9 + 10^0 * 9
//first nine is -1 so:
-1 * 10^3 + 999 = -1000 + 999 = -1
现在使用二进制文件会更加简单,因为第一个数字只是告诉我的符号是什么。尝试使用8位数字:
1111 1111
这显然是-1,因为如果我们加1,结果就是0.你可能会说我正在铺设,因为你可以简单地添加以下内容:
1111 1111
0000 0001 +
1 0000 0000 =
但补充系统不正确。这是因为在补充系统中,第一个数字不仅描述数字的符号,而且所有数字都可以无限扩展到该数字!这就是为什么id补码十进制99 = 9999!这也意味着我们可以轻松地将8个字节的数量扩展为例如32个字节!
例如尝试使用数字17和-1。你现在熟悉-1。在8个字节中,两个的Complemex -1是:
1111 1111
扩展到32个字节,它给了我们:
1111 1111 1111 1111 1111 1111 1111 1111
要将它转换为普通十进制,我们需要做2 ^ 31 + 2 ^ 30 + ... + 2 ^ 0但是(正如我所提到的)第一个是-1,所以它正好是-1 * 2 ^ 31 + 2 ^ 30 + .. + 2 ^ 0如果你计算它正好-2147483648 + 2147483647 = -1!
<0001> 0001 0001(十进制17)扩大到32个叮咬给出:
<00> 0000 0000 0000 0000 0000 0000 0001 0001我们可以同意它仍然是17:)
为了提供我不是一些疯狂的东西,只是IT学生我将提供完全符合这些要求的C ++代码:
#include <iostream>
using namespace std;
int main(void)
{
char eightBits = 255; //eightBits := 0x11111111
int eightBytes = eightBits; //eightBytes becaming 255, right?
cout <<eightBytes <<endl; // MAGIC !
return 0;
}
答案 2 :(得分:0)
这里的未说出的位是关于标志的。它存储在前端并表示符号。
http://www.binaryconvert.com/result_signed_short.html?decimal=045049049055052050
更简洁,一个16位字&#39;或整数通常称为“短”&#39;在大多数系统上,代表-32,768和+32,767之间的有符号数字。这是&#39;二进制&#39;您的教师所引用的编号,不是直接存储为二进制数,而是以二进制格式存储。实际上只有15个点可以存储该值,还有一个必须为该符号保留。否则,无符号值可以将所有16个点用于数字,因此可以从0到+65,535。
答案 3 :(得分:0)
表示二进制数的方法有多种:
数字系统通常使用2的补码表示。
获取2的补码中的二进制数的十进制数:
1.第一位是符号位。如果数字从0开始,则为正数,否则为负数
2.如果数字为正,则其十进制值是符号位以外的其余位的无符号值。如果数字为负,则其绝对十进制值=(剩余比特的补码的有符号值)+1。
答案 4 :(得分:0)
在计算机中,通常假设最左边的位重复无限次,表示“二进制补码”有符号数,因此位序列(1101 0010 0010 0010)被视为(1111 ... .1111 1101 0010 0010 0010)。虽然无穷大的一串可能看起来像一个无限大的数字,但在这样的字符串中加一个将产生无限的零串(即0)。因此,无限的1串是1的加法逆,因此其有效值为-1。一个无限的字符串后跟一些零,将是单个1的加法逆,后跟该数量的零(因此在您的示例中,最左边的“1”的有效值为-32768而不是+32768) 。虽然将幂级数公式应用于1 + 2 + 4 + 8 + 16 + 32 + 64 ...产生-1这一事实通常被视为异常,但它与“二进制”数学运算的方式一致
请注意,尽管对二进制补码数学的许多描述只是将最高位的“缩放因子”的符号描述为被反转(例如-32768而不是+32768),但考虑使用最左边位的副本进行左填充这使得更容易理解为什么有符号数字的行为就好像最左边的数字是重复的一样(例如,将负16位整数转换为32位整数,将最左边的16位填充为1)。