所以...与位和字节搏斗,我想到如果我说“第n个字节的第一位”,它可能并不意味着我认为它意味着什么。到目前为止,我假设如果我有这样的数据:
00000000 00000001 00001000
然后
然后我了解到类型化字节集合中的字节顺序由系统的字节顺序决定。在我的情况下,它应该是小端(窗口,英特尔,对吗?)这意味着像01 10作为16位uinteger应该是2551,而在大多数程序处理内存它将表示为265 ..不知道什么是什么去那儿。
我还了解到一个字节中的位可以按任意顺序排列,似乎没有明确的答案,哪个位是实际的第一个位,因为它们也可能受到位结尾和人们对什么是第一个的定义不同。对我来说,从左到右,对于其他人来说,当你加1到0或从右到左时,它可能是第一次出现的。
为什么这有关系?好吧,好奇心,但我也试图编写一个能够从位地址Y开始提取X位数的类。我设想它类似.net字符串,我可以去输入“.SubArray(12 (位置),5(长度))“然后在这篇文章顶部的数据的情况下,它将检索”0001 0“或2。
所以有人可以澄清我的环境中的位和字节的第一个和最后一个是什么,它是从右到左,从左到右还是两个,是吗?为什么这个问题首先存在,为什么编码祖先不能就某些东西达成一致并坚持下去呢?
答案 0 :(得分:6)
shift是一个算术操作,而不是基于内存的操作:它用于处理值,而不是它的表示。向左移动相当于乘以2,向右移动相当于除以2。 这些规则首先保留,如果它们与内存中多字节类型的位的排列冲突,那么对于内存中的排列来说就是如此。 (由于移位是检查一个字节内的位的唯一方法,这也是为什么在一个字节内没有有意义的位顺序概念的原因。)
只要将操作保持在单个数据类型中(而不是对长整数进行字节移位并将它们作为字符序列进行检查),结果将保持可预测。在这种情况下,通过不同的整数类型检查相同的内存块有点像执行整数运算然后将这些位读取为浮点数;会有一些变化,但它不是整数算术定义的位置,而是准确地说 what 。这超出了他们的范围。
答案 1 :(得分:2)
你有一些了解,但有一些误解。
首先,诸如移位之类的算术运算不关心存储器中位的表示,它们正在处理该值。内存表示发挥作用的地方通常是在混合中进行跨平台通信的分布式环境中,其中一个系统上的数据在另一个系统上的表示方式不同。
您的第一条评论......
我还了解到一个字节中的位可以按任意顺序排列,似乎没有明确的答案,因为它们也可能受到位结尾和人们的定义。首先不同的是
这并非完全正确,尽管这些位仅由读取器和数据写入器给出,通常在8位字节内的位总是从左(MSB)到右(LSB)读取。字节顺序由系统体系结构的字节序决定。它与内存中数据的表示有关,而不是算术运算。
其次...
为什么这个问题首先存在,为什么编码祖先不能就某些东西达成一致并坚持下去呢?
来自维基百科:
最初的字节序设计选择大多是随意的,但后来的技术修订和更新使相同的字节序(以及许多其他设计属性)保持不变,以保持向后兼容性。例如,Intel x86处理器代表了一种常见的小端架构,IBM z / Architecture大型机都是大端处理器。这两种处理器架构的设计者在20世纪60年代和70年代将其最终产品推向市场,从而确定了它们的端点。 Big-endian是数据网络(包括IPv6)中最常见的惯例,因此它的伪同义词网络字节顺序,而小端在微处理器中很受欢迎(尽管不是通用的),部分原因是英特尔具有重要的历史影响力微处理器设计。也存在混合形式,例如,16位字内的字节顺序可能与32位字内的16位字的排序不同。这种情况有时被称为混合端或中端。还有一些双端处理器可以在little-endian或big-endian模式下运行。
...最后
为什么这有关系?好吧,好奇心,但我也试图写一个能够从位地址Y开始提取X位数的类。我设想它类似于.net字符串,我可以去输入"。 SubArray(12(位置),5(长度))"然后,如果在这篇文章的顶部有数据,它将检索" 0001 0"或2.
许多编程语言和库提供的功能允许您转换为/从网络(大端)和主机顺序(取决于系统),以便您可以确保您正在处理的数据格式正确,如果你需要关心它。由于您具体询问了位移,因此在这种情况下并不重要。
阅读this post了解详情