首先我要声明,我并不是一名计算机专家。我主要是对这些信息感到好奇。
在与计算机科学专家的交谈中,我被告知,一串十进制数值,如 73829182093,可能是存储在硬盘上,通过使用十六进制系统,只占用所需字节的一半。正如专家所说,一串六个十进制数字可以存储为 3 个字节,因为每个数字都可以用十六进制数字表示,而十六进制数字的大小只有 4 位。对于硬盘上的存储,这是否正确?请注意,我指的是硬盘上的存储,而不是显示所需的内存。
我以前的理解是,所有信息都以二进制形式(0 和 1)存储在硬盘上,在现代计算机硬盘中以 8 位块的形式存储。十六进制用于方便展示的信息,因此人类不需要阅读长段的比特。
如果这是真的,这是否意味着在特定情况下,硬盘上的 8 位块(十六进制存储)将编码两个半字节的数据,而不是字符(如字母“M”)的 8 个完整位?或者在硬盘上,半字节实际上是用完整的 8 位表示的,然后在显示时被省略?
谢谢。
答案1
我以前的理解是,所有信息都以二进制形式(0 和 1)存储在硬盘上,在现代计算机硬盘中则以 8 位块的形式存储。使用十六进制是为了方便显示信息,这样人们就不需要阅读长长的位块了。
完全正确。十六进制只是表示数据;与其他格式相比,十六进制的性质并没有什么特别之处。它不支持数据压缩或类似的东西。
我认为你的朋友指的是将数字表示为字符串相对将数字表示为数字。
对于无符号整数(以位(零和一)表示的数字,范围从 0 到某个固定的最大数),假设从 0 开始,N 位可以表示的最大数是 2^N 减 1。
因此,如果您有 8 位(即 1 个字节),则可以表示从 0 到 255 的每个数字而不会丢失信息;您可以在 0 和 1 之间操纵这 8 位,以明确表示从 0 到 255(含)的每个数字。或者从 1 到 256,如果您愿意的话。这没关系。不过,计算机倾向于从 0 开始表示它们。
如果有 16 位(2 个字节),则可以表示从 0 到 65535 的每个数字(即 2^16 - 1)。32 位表示从 0 到 4294967295 的每个数字。64 位表示从 0 到 1.8 的每个数字,十九个零。
你可能从代数中知道 2^N 是指数函数。这意味着,即使 64 位只是位数增加八倍超过8位,它可以存储方式,方式,方式与数字(只有 2040!)相比,8 倍位数的数据更多255*8
。与大约 1800000000000000000000 相比,2040 是一个非常小的数字。64 位可以存储从 0 一直到最大值的每个数字。
以这种方式存储整数的一个有趣的含义是程序员必须决定提前存储空间需要多大,这反过来又决定了给定整数可以表示的最大数字。如果你试图存储一个大于存储空间可以处理的数字,你就会得到一个叫做溢出。例如,如果您有一个 8 位整数,设置为 255,然后您要求计算机为其加 1。那么,您无法在范围为 0 到 255 的整数中表示 256!通常发生的情况是它“绕回”到起点,然后回到 0。
那里是以“任意精度”模式执行数学运算的程序会根据所处理数字的大小自动调整其存储空间的大小;例如,如果将 255 乘以 100000,则答案必须超过 8 位和 16 位,但适合 32 位整数。如果您输入一个数字或执行数学运算,而产生的数字大于 64 位整数的最大值,则必须为其分配更多空间。
然而——如果你将数字表示为字符串,那么每个数字将占用与信在书面散文中。“ASDF”和“1234”占用的空间完全相同。“OneTwoThreeFourFive”(19 个字符)占用的空间与“1234567890123456789”相同。所需空间量会增加线性地数量数字(或字母,或人物,一般来说)你有。这是因为每个字符可以代表任意一个字符在字符集,而数字只是字符集中的字符。特定的零和一序列将产生数字“3”,不同的序列将产生“4”,等等。
通常情况下,字符存储占用 8 位或 16 位,但有些字符编码要么根据字符占用可变数量的位数(如 UTF-8),要么始终占用较大数量的位数(如 UCS-32)。
如果每个字符占用 8 位,则“OneTwoThreeFourFive”和“1234567890123456789”都占用 152 位。但“1234567890123456789”可以容纳在64 位无符号整数,仅消耗64 位。这节省了 88 位!我们甚至没有使用任何“数据压缩”技巧,如 Zip、7-Zip、RAR 等。
答案2
我以前的理解是,所有信息都以二进制形式(0 和 1)存储在硬盘上,在现代计算机硬盘中则以 8 位块的形式存储。使用十六进制是为了方便显示信息,这样人们就不需要阅读长长的位块了。
您之前的理解完全正确,我感觉您已经理解了此答案的其余部分,但我想解释一些人们经常混淆的想法。我会尽量简短,但这会很难。
字节,存储
数据通常以 8 位块(称为字节)的形式存储在硬盘(或内存中)。单个位有两个可能的值,按照惯例,我们将其称为 0 和 1。因此,单个字节有 2 8 = 256 个可能的值。
我其实不知道为什么 8 位块是典型的单位。我对计算机发展的历史不太熟悉,但我至少可以告诉你,我们继续在常见系统上使用 8 位字节,因为我们目前已经被锁定在这一点上,并且没有理由进行改变。
此外,因为我知道这会出现,实际上数据不一定以单字节块或一次一个字节的方式存储在驱动器上。典型的硬盘驱动器通常使用更大的块等。但是,对于您的问题的范围而言,这些都不重要。重要的是它我们认为硬盘以单个字节为单位进行操作。实际实现是一个有趣的话题,但并不影响我们在这里讨论:传统上,人们通常以单个字节为单位讨论存储,我们可能是人类。
二进制、十六进制
在讨论与位相关的事物(如字节)的值时,我们经常使用二进制表示法,原因很简单,因为这是最有意义的。由于一个位有两个可能的值,这自然就转化为数字的二进制表示(二进制意味着每个数字有两个可能的值,而我们通常每天使用的十进制系统则每个数字有十个可能的值)。
我们程序员也喜欢使用十六进制(每个数字有十六个可能的值)表示法,因为它真的很方便。碰巧的是,单个十六进制数字可表示的范围与四个二进制数字可表示的范围完全对应。这非常适合我们的 8 位字节:两个十六进制数字可以表示一个字节的每个值。这对我们的大脑来说也是一个可管理的系统,一旦你习惯了,就很容易将十六进制与二进制联系起来。
我们本可以使用 256 进制系统来书写,但这样很不方便,因为很难想出 256 个易于输入、朗读和记忆的字符。我们本可以使用 17 进制系统,但这与 8 位二进制数不太吻合。因此我们使用十六进制,因为这对我们来说非常有意义。
文本
我们经常使用文本,因此,找到一种标准方法将我们每天使用的字符表示为一系列字节对我们大有裨益。这种将字符映射到字节的方法称为“字符编码”或“字符集”。当然,我们实际上很难就某些事情达成一致,而且许多不同的此类映射都是为满足不同的需求而独立开发的,因此我们有许多字符集,如 ASCII、ISO-8859-1 或日本标准。
顺便说一句,unicode 的发明是为了尝试定义一个让所有人满意的标准,统一我们所有的各种字符编码,因此得名“unicode”。
但关键在于,文本是由一系列字节表示的,而每个字节系列的确切含义由各种字符编码决定,字节表示文本这一事实完全依赖于读取字节的程序理解它们应该表示文本的假设。ASCII 是一个方便讨论的语言,因为每个字符都映射到一个字节,而且它非常古老、非常简单、使用非常广泛,尽管对于全球社区来说严重不足,但仍然非常流行且易于讨论。
语义
我确信,这是让很多人最困惑的一点。
字节只是字节。它们本质上具有任意值。这些值实际上意思是仅由上下文以及读取它们的程序实际对它们执行的操作决定。
例如,回想一下一个字节可以取 256 个值,值 97(二进制 01100001,十六进制 61)最终可以表示许多不同的东西:
- 如果将该字节视为整数值,则它就是数字 97。
- 如果该字节被视为 ASCII 字符,则它就是字母
a
。 - 如果该字节被视为 Intel x86 兼容处理器的机器指令,则它就是
POPA
或POPAD
指令(如果你不知道这些是什么也没关系,这不是重点)。 - 如果该字节代表灰度图像中的一个像素,那么它可能是这种灰色。
- 如果该字节是某个游戏的某些地图数据的一部分,那么它可能是一棵树、一道栅栏或其他东西。
- ETC。
即使对于数值,位模式也可以具有不同的含义,例如:
- 有时我们对 0-255 的值感到满意。其他时候,我们想要处理负数,因此我们将语义值的范围移至 -128 到 127,并使用第一位来指示它是否为负数。或者其他什么。天空是极限(尽管与字符编码一样,整数值也有一套普遍认可的标准规则)。
- 有时由于各种情况,我们甚至以其他方式编码整数值,例如浮力调节装置。
- 有时我们需要表示更大的整数。所以我们使用很多字节。即使这个也有选项,请参阅“字节顺序”。
- 有时我们需要表示十进制数。这里也有很多选项,请参阅浮点和固定点点击此处查看选项。
所有这些的重点是字节只是一个字节,除非您有上下文,否则它没有任何意义。如果程序写入了一些具有某些预期含义的字节,那么只有读取它们并将它们解释为具有相同含义的程序才能正确理解它。
把这些放在一起
所以现在,将这一切与您的答案联系起来,这实际上应该非常简单:
- 你的朋友指的是将数字存储为以十六进制表示其值的文本形式。例如,十六进制中的值 97 可能是 61。这是一个两位数,包含字符“6”,后跟“1”。编码为ASCII那将是两个字节:值 54 后跟值 49(十进制)。但这只有当您读回这些字节时,您理解它们是两个 ASCII 编码的十六进制数字时才有意义。
- 你也可以只存储值 97。这只有一个字节。这是前一个选项长度的一半。但当然,这只有在你读回该字节时,将其理解为直接对应于整数值才有意义。
通常,我们程序员可能会选择第二种选择,但这真的取决于上下文。例如,在设计为人类可读文本的 HTML 文档中,我们仍会存储类似这样的属性width="97"
。当然,在这里使用一些更紧密的表示可能会占用更少的空间,但编写 HTML 会很麻烦。所以这真的取决于上下文和用例。
我希望其中至少有一部分是有意义的。
答案3
一串六位十进制数字可以存储为 3 个字节
这听起来像是 BCD(二进制编码的十进制)表示法,而不是数字 ASCII 字符(每个数字一个完整字节)。四位用于表示 0 到 9 的值。(其他六个值未定义/无效。)
BCD 值可以解包(每个字节一个 BCD 数字)或打包(每个字节两个 BCD 数字)。
与二进制相比,使用 BCD 的优点是便于人机显示(即可进行简单的转换),并且不会损失小数的精度(例如十分之一是一个无限循环的二进制数)。
计算器通常使用 BCD 表示法而不是二进制。信用卡和安全/访问卡上的长串数字通常在磁条上或传输的 RF 数据包中编码为 BCD 字符串。
数字计算机通常使用二进制表示法进行计算和存储。CPU 可能有执行 BCD 算术的指令。