“bits are not addressable”是什么意思对于傻瓜(比如我和我的学生)?
计算机可以存储/移动/更改的最小值/实体是一个字节 = 8 位。您不能指示它读/写 3 位,然后 1 位,然后 11 位,并告诉计算机将它们作为单独的值存储。不,它只处理单个字节或字节包/范围。
然后,任何应用程序/进程/硬件都可以使用字节内的位(或本机整数类型,总是字节的倍数)。
然而,一旦播放完毕,内存/存储中存储的值仍然是字节的“范围”,每个单独的 BYTE 值 - 尽管它们的位被修改 - 都会在 BYTE 级别直接更新为它们的新值 。
这意味着,除非你构建处理器,你实际上只处理字节,0-255,句号。
在记录中?是的。内存地址?是的。文件数据/流?是的。网络传输?是的,该死的!
例如:假设我在 我的 LittleEndian 计算机上,在我的应用程序的内存中有 3 字节(24 位)记录:
structure Test24 {
var16 : 0xC1D3, // 49619 = 1100 0001 1101 0011
var8 : 0xCA // 202 = 1100 1010
}
记录我将 raw 保存在一个文件中,然后在他的 BigEndian 机器 上将其传递给好友。在同一应用程序中加载记录后,他在机器上得到的是:
structure Test24 {
var16 : 0xD3C1, // 54209 = 1101 0011 1100 0001 (bytes swapped)
var8 : 0xCA // 202 = 1100 1010 (same value)
}
var16 略有不同(已损坏),但那是因为我没有编写应用程序来处理 BigEndian 架构上的 IO 数据。尽管位被完全交换,但他没有得到以下记录:
structure Test24 {
var16 : 0xCB83, // 52099 = 1100 1011 1000 0011 (bits swapped)
var8 : 0x53 // 83 = 0101 0011 (different value)
}
^^ 这是因为文件是逐字节读取的,而不是逐位读取的。
这就是“位不可寻址”的含义。
学生:但是为什么人们喜欢 LSBit (LSB-0)、MSBit,有时还有位字节序,比如 “这是非常重要的知识”?
因为这种调用位的方式实际上消除了等式中的字节顺序问题。以正确的方式使用事物的含义,至少,使用逻辑。当我们混淆谈论数据和谈论(处理器)架构时,就会产生误解。他们 - 未重新发布!
数据需要上下文,例如“此地址的此字节包含定义您在系统上的访问权限的八个标志”。这不是字节序问题,这就是给定索引的位在定义数据的上下文中的用途。
我们人类被训练成横向阅读。但问题来了:
What is byte 241 ? How we may represent what it contains ?
perhaps on little endian, LSB-0 on the left (?)
bit index : 0, 1, 2, 3, 4, 5, 6, 7 => 10001111b ?
or on big endian, LSB-0 on the right (?)
bit index : 7, 6, 5, 4, 3, 2, 1, 0 => looks more intuitive 11110001b
STOP SHOOTING YOURSELF IN THE FOOT ! Consider looking at it this way :
LSB 0 <- see : here it is, it doesn't matter where it is, it's just there
1
2
3
4
5
6
MSB 7 <- and here the other one, on the opposite side.
or this way :
MSB 7
6
5
4
3
2
1
0 LSBit
LSB-0 MSBit 在哪里并不重要,只要一个在另一个的对面。让字节序不碍事!使用 LSB-0 术语来修复数据编码的开始。
^^ 现在当你定义 “数据标志顺序从 LSB-0 开始”,标志是,“目录打开,打开密码保护,目录复制,复制密码保护,目录write, write pwd protected, directory delete, delete pwd protected”,意思是:
LSB 0 directory open
1 open pwd protected
2 directory copy
3 copy pwd protected
4 directory write subitem
5 write to pwd protected
6 delete subitem
MSB 7 delete pwd protected
所以241 = LSB-0 : 1, 0, 0, 0, 1, 1, 1, MSB : 1的字节值意味着
LSB 0 = 1 -> you can open directory
1 = 0 -> directory access is not password protected
2 = 0 -> you cannot copy directory
3 = 0 -> noop
4 = 1 -> you may create files or sub directories
5 = 1 -> but a password is required to create file or dir
6 = 1 -> you may delete the things in the directory
MSB 7 = 1 -> but a password is required to delete
在数据方面不涉及位级别的字节序,当您为字节的值赋予含义时,只有位位置很重要,并且 LSB-0 始终为 0x01,无论是大端机器还是小端序。
字节值与机器如何处理比特无关,无论是否最重要。所以当你问“我的数据会损坏吗?”时,没有人应该在左边或右边谈论 MSBit 或 LSBit。如果你问“这个 CPU 上最不稳定的位是什么?”,你去吧,LSB/MSB 位置就在谈话的中间(但是你是处理器工程的吗?) p>
答案是:这不会发生,只要您不在硬件级别写入 ROM 数据,并且在通过不同架构传输数据时只关心字节级别的字节序/协议。人们因为不必要的字节序戏剧而感到困惑,而字节序的东西潜伏在不应该的地方。
至少,这就是我来这里的原因,让学生们开始了解对于给定的挑战/关注点来说什么是重要的。如果他们已经知道,他们就不会在这里。大多数人只有小端计算机或大端计算机,没有交叉检查的特权。他们只是不确定,他们是通过谷歌到达这里的,“位不可寻址” errrmm...什么?那是什么意思 ?我是否应该以字节或位级别交换我的游戏数据以在所有平台上正确读取?我仍然不知道:/这就是人们会问的根本原因。除了“位不可寻址”这一技术事实之外,还有一些人不具备完全理解这种说法的含义的背景。
只有在极少数情况下,您才需要关心字节序,您实际上是通过您的应用程序通过您的专有或借用的流读/写逻辑对您自己制作的(或公司指定的)二进制数据进行编码。
不想处理字节顺序,使用具有内置读/写功能的引擎/框架(如数据库、云等)或使用 Json 或 XML 等纯文本。