Binary “计算机是如何看的?”;大数字;?

Binary “计算机是如何看的?”;大数字;?,binary,computer-science,computer-architecture,Binary,Computer Science,Computer Architecture,今天在课堂上,我决定用二进制代码写日期,但在思考如何写“2015”时,我突然意识到这将是一个大数字:11111 011111。我知道每个位都是0或1可以占用的空间,一个字节由8位组成,但只有7位用来写数字(我不知道为什么),2015二进制格式需要7个以上的空间,甚至8个,所以它比一个字节要多,那么计算机如何管理大于255的数字(ASCI最大数字),例如在除法中,如何划分2个字节,或者如何将2个字节设为1 也许我有一个错误的想法,所以我想让你们向社区解释一下(告诉我,我不是唯一一个有这种怀疑的人)

今天在课堂上,我决定用二进制代码写日期,但在思考如何写“2015”时,我突然意识到这将是一个大数字:11111 011111。我知道每个位都是0或1可以占用的空间,一个字节由8位组成,但只有7位用来写数字(我不知道为什么),2015二进制格式需要7个以上的空间,甚至8个,所以它比一个字节要多,那么计算机如何管理大于255的数字(ASCI最大数字),例如在除法中,如何划分2个字节,或者如何将2个字节设为1


也许我有一个错误的想法,所以我想让你们向社区解释一下(告诉我,我不是唯一一个有这种怀疑的人)。

他们将它们存储在多个字节中,通常是4(32位算术)或8(64位算术)。浮点数稍微复杂一些,但基本上是±x·2^y的形式。有时,人们编写自己的类,通过将它们分解成硬件可以处理的块来处理更大的数字。你可以用你在小学学过的方法来做大数的加法,但在基数4294967295中:从右到左把每一列相加,如果结果太宽,就用1

有时候,数字可以是正的,也可以是负的,你需要用一位来表示。但有时,位只代表正数。因此,您可以在能够表示范围[-128127]或范围[0255]的字节之间进行选择。

计算机将所有值视为一组位。如果使用更多位来表示值,则通常可以表示更多不同的值

char
不一定必须是8位。然而,(标准)要求
无符号字符
至少表示
0
255
之间的一组值,而
有符号字符
至少需要表示
-127
127
之间的一组值。这些二进制范围要求每个至少8位。无论
char
signed
还是
unsigned
,都是由实现定义的,并且没有任何东西可以阻止支持比标准要求的更大范围值的实现。没有限制,只有七位的
char
类型用于写入值-但许多常用字符集(例如ANSI)只需要0到127之间的值,因此新手经常错误地认为这是C语言的一些要求。事实并非如此

至于表示比字符更大的值范围,很简单,没有什么可以阻止一个与多个字符大小相同的变量。
int
的最低要求是支持范围-32767到32767,这在二进制机器上需要16位,相当于一对在内存中连续的
char
s(一个接一个)。对于现代实现来说,支持32位
int
(由一组4个连续的8位字符组成)并因此支持(至少)
-2147483647
2147483647
的范围并不少见

用多个位表示的值的加、减、乘、除并没有什么神奇之处。适用于涉及单个位的操作的基本原理扩展到使用一组位表示的变量。需要进行一点簿记(例如,添加时的进位,考虑符号位),如果结果无法存储,则会有一些限制(例如,
127+127
不能存储在仅由8位组成的
符号字符中)


要讨论二进制计算机如何在硬件中实现所有这些功能,您需要了解基本电子学(晶体管、电路等)。所有东西的基本构造块都是晶体管,以及它们之间的连接(布线、电阻器、电容器等)。基本上(非常简单地说),每个不同的位都需要一个晶体管(不同管脚之间的不同电压决定该位是开还是关),并且多位变量使用一组晶体管表示。类似地,使用逻辑电路(门等)实现对每一位的操作,并且通过逻辑电路实现对多位变量的操作,这些逻辑电路在两个变量中顺序(如果只有一个逻辑电路)或并行地对每对位执行相同的操作(通过简单地复制电路,每一位对应一个电路,另外还有一个用于记账的电路)。因为现代处理器由数十亿个晶体管(和其他电路元件)组成,在数字硬件设计中有相当大的自由度,可以使用多个位来表示变量,并以各种方式对变量执行操作。

通常计算机硬件工作在32位或64位数字上。一个字节不是一个数字中可能的最大位数,它只是几种常见大小之一。