今天在课堂上我决定用二进制代码来写日期,但在考虑如何写“2015”时,我内心地意识到它将会是一个很大的数字: 11111011111 。据我所知,每个位是0或1的空间 e,字节符合8位,但只有7位用于写入数字(I不知道为什么), 2015二进制文件占用的空间超过7个甚至8个,因此它超过超过一个字节,所以计算机如何管理数字大于255 (ASCI最大数字),例如在一个分区中,它们如何划分2个字节,或者它们如何使2个字节1?
也许我有一个错误的想法,所以我希望你们能为社区解释这个问题(告诉我,我不是唯一有这个疑问的人)。
答案 0 :(得分:2)
它们以多个字节存储它们,通常是4(32位算术)或8(64位算术)。浮点数稍微复杂一些,但基本上有± x ·2 ^ y 的形式。有时人们会编写自己的类,通过将它们分解为硬件可以处理的块来处理更大的数字。您可以像在小学阶段学到的那样添加非常大的数字,但是在基础4,294,967,295中:从右到左一起添加每个列,如果结果太宽,请携带1。
有时候,数字可以是正数也可以是负数,你需要使用一位数。但有时,这些位仅代表正数。因此,您可以在一个能够表示范围[-128,127]或范围[0,255]的字节之间进行选择。
答案 1 :(得分:0)
所有价值观都是"见过"通过计算机作为一组位。如果使用更多位来表示值,则通常可以表示更多不同的值。
char
不一定要求为8位。但是,(标准)需要unsigned char
来表示0
和255
之间的至少一组值,而signed char
至少需要-127
127
和char
之间的值集。这些范围以二进制形式,每个范围至少需要8位。实现定义了signed
是unsigned
还是char
,并且没有什么能阻止实现支持比标准要求更大范围的值。没有限制,只有7位char
类型用于写入值 - 但是许多常用的字符集(例如ANSI)只需要0到127之间的值,因此新手经常会犯这样的错误:是对C的一些要求。它不是。
至于表示比int
更大的值范围 - 很简单,没有什么能阻止变量具有与多个字符相同的大小。 char
的最低要求是支持-32767到32767的范围,二进制机器需要16位,等于内存中连续的一对int
(一个接一个) )。现代实现支持32位-2147483647
(由一组4个连续的8位字符组成)并不罕见 - 因此支持一系列(至少)2147483647
到{{1 }}
添加,减去,乘以,除以由多个位表示的值没有什么不可思议的。适用于涉及单个位的操作的基本原理扩展到使用一组位表示的变量。需要一些簿记(例如,在添加时携带位,计算符号位),以及如果无法存储结果的一些限制(例如127+127
无法存储在包含的signed char
中只有8位)。
要讨论二进制计算机如何在硬件中完成所有这些工作,您需要了解基本的电子设备(晶体管,电路等)。所有东西的基本构建块都是晶体管,以及它们之间的连接(布线,电阻,电容等)。基本上(非常简单地)每个不同的位需要晶体管(不同引脚上的不同电压确定该位是接通还是断开),并且使用一组晶体管表示多位变量。类似地,每个位的操作使用逻辑电路(门等)实现,并且多位变量的操作由逻辑电路实现,逻辑电路对两个变量中的每对位执行相同的操作(如果只有一个逻辑电路) )或并行(通过简单地复制电路,每个位有一个电路,以及一些用于簿记的附加电路)。由于现代处理器由数十亿个晶体管(和其他电路元件)组成,因此数字硬件设计中有相当大的自由度来表示使用多个位的变量,并以各种方式对变量进行操作。