计算机如何看到 "big numbers"?
How do computers see "big numbers"?
今天 class 我决定要用 二进制代码 写日期,但在考虑如何写 "2015" 时 =23=] 我立即意识到这将是一个很大的数字:11111011111。我明白每个 bit 是 space 一个 0 或 1 可以取 e,一个 byte 是 8 bits,但是只有7个用来写数字(不知道为什么),而2015用二进制写要超过7space甚至8,所以占了超过一个字节,那么计算机如何管理大于255(ASCI最大数字)的数字,例如在除法中,他们如何划分2个字节,或者他们如何将 2 个字节变为 1?
也许我的想法是错误的,所以我希望你们为社区解释一下(告诉我,我不是唯一有这个疑问的人)。
他们将它们存储在多个字节中,通常是 4(32 位算术)或 8(64 位算术)。浮点数稍微复杂一点,但基本上都是±x·2^y的形式。有时人们编写自己的 类 可以通过将它们分解成硬件可以处理的块来处理更大的数字。你可以用你在小学学到的相同方法做真正大数字的加法,但是在基数 4,294,967,295 中:从右到左将每一列加在一起,如果结果太宽,进位 1.
有时,数字可以是正数也可以是负数,您需要为此使用一位。但有时,这些位只代表正数。因此,您可以在能够表示范围 [-128,127] 或范围 [0,255].
的字节之间进行选择
所有值都是 "seen" 由计算机作为一组位。如果使用更多位来表示一个值,通常可以表示更多不同的值。
A char
不一定要求是8位。然而,unsigned char
需要(根据标准)至少代表 0
和 255
之间的一组值,而 signed char
至少需要代表-127
和 127
之间的一组值。这些范围,以二进制表示,每个范围至少需要 8 位。 char
是 signed
还是 unsigned
是由实现定义的,并且没有什么可以阻止实现支持比标准要求更大范围的值。没有限制只用7位char
类型来写值——但是一些常用的字符集(例如ANSI)只需要0到127之间的值,所以新手经常会错误地认为是对C的一些要求。它不是。
至于表示比 char
更大的值范围 - 很简单,没有什么可以阻止具有与多个字符相同大小的变量。 int
的最低要求是支持-32767 到 32767 的范围,这在二进制机器上需要 16 位,等于内存中连续的一对 char
(一个接一个) ).现代实现支持 32 位 int
(由一组 4 个连续的 8 位字符组成)并不少见 - 因此支持(至少)-2147483647
到 [=26] 的范围=].
由多个位表示的值的加减乘除没什么神奇的。适用于涉及单个位的操作的基本原则扩展到使用一组位表示的变量。需要一些簿记(例如,加法时进位,考虑符号位),如果结果无法存储则有一些限制(例如 127+127
不能存储在 signed char
中,它包含只有 8 位)。
要讨论二进制计算机如何在硬件中完成所有这些事情,您需要了解基本的电子学知识(晶体管、电路等)。一切事物的基本构建块都是晶体管,以及它们之间的连接(布线、电阻器、电容器等)。本质上(非常简单地)每个不同的位都需要一个晶体管(不同引脚上的不同电压决定该位是打开还是关闭),并且使用一组晶体管表示多位变量。类似地,对每一位的操作是使用逻辑电路(门等)实现的,对多位变量的操作是由逻辑电路实现的,逻辑电路要么对两个变量中的每一对位依次执行相同的操作(如果只有一个逻辑电路)或并行(通过简单地复制电路,每个位一个电路,以及一些用于簿记的附加电路)。由于现代处理器由数十亿个晶体管(和其他电路元件)组成,因此数字硬件设计具有相当大的自由度,可以使用多位表示变量并以各种方式对变量执行操作。
今天 class 我决定要用 二进制代码 写日期,但在考虑如何写 "2015" 时 =23=] 我立即意识到这将是一个很大的数字:11111011111。我明白每个 bit 是 space 一个 0 或 1 可以取 e,一个 byte 是 8 bits,但是只有7个用来写数字(不知道为什么),而2015用二进制写要超过7space甚至8,所以占了超过一个字节,那么计算机如何管理大于255(ASCI最大数字)的数字,例如在除法中,他们如何划分2个字节,或者他们如何将 2 个字节变为 1?
也许我的想法是错误的,所以我希望你们为社区解释一下(告诉我,我不是唯一有这个疑问的人)。
他们将它们存储在多个字节中,通常是 4(32 位算术)或 8(64 位算术)。浮点数稍微复杂一点,但基本上都是±x·2^y的形式。有时人们编写自己的 类 可以通过将它们分解成硬件可以处理的块来处理更大的数字。你可以用你在小学学到的相同方法做真正大数字的加法,但是在基数 4,294,967,295 中:从右到左将每一列加在一起,如果结果太宽,进位 1.
有时,数字可以是正数也可以是负数,您需要为此使用一位。但有时,这些位只代表正数。因此,您可以在能够表示范围 [-128,127] 或范围 [0,255].
的字节之间进行选择所有值都是 "seen" 由计算机作为一组位。如果使用更多位来表示一个值,通常可以表示更多不同的值。
A char
不一定要求是8位。然而,unsigned char
需要(根据标准)至少代表 0
和 255
之间的一组值,而 signed char
至少需要代表-127
和 127
之间的一组值。这些范围,以二进制表示,每个范围至少需要 8 位。 char
是 signed
还是 unsigned
是由实现定义的,并且没有什么可以阻止实现支持比标准要求更大范围的值。没有限制只用7位char
类型来写值——但是一些常用的字符集(例如ANSI)只需要0到127之间的值,所以新手经常会错误地认为是对C的一些要求。它不是。
至于表示比 char
更大的值范围 - 很简单,没有什么可以阻止具有与多个字符相同大小的变量。 int
的最低要求是支持-32767 到 32767 的范围,这在二进制机器上需要 16 位,等于内存中连续的一对 char
(一个接一个) ).现代实现支持 32 位 int
(由一组 4 个连续的 8 位字符组成)并不少见 - 因此支持(至少)-2147483647
到 [=26] 的范围=].
由多个位表示的值的加减乘除没什么神奇的。适用于涉及单个位的操作的基本原则扩展到使用一组位表示的变量。需要一些簿记(例如,加法时进位,考虑符号位),如果结果无法存储则有一些限制(例如 127+127
不能存储在 signed char
中,它包含只有 8 位)。
要讨论二进制计算机如何在硬件中完成所有这些事情,您需要了解基本的电子学知识(晶体管、电路等)。一切事物的基本构建块都是晶体管,以及它们之间的连接(布线、电阻器、电容器等)。本质上(非常简单地)每个不同的位都需要一个晶体管(不同引脚上的不同电压决定该位是打开还是关闭),并且使用一组晶体管表示多位变量。类似地,对每一位的操作是使用逻辑电路(门等)实现的,对多位变量的操作是由逻辑电路实现的,逻辑电路要么对两个变量中的每一对位依次执行相同的操作(如果只有一个逻辑电路)或并行(通过简单地复制电路,每个位一个电路,以及一些用于簿记的附加电路)。由于现代处理器由数十亿个晶体管(和其他电路元件)组成,因此数字硬件设计具有相当大的自由度,可以使用多位表示变量并以各种方式对变量执行操作。