【问题标题】:Binary notation and Endianness二进制符号和字节序
【发布时间】:2014-01-21 13:38:21
【问题描述】:

我们可以说我们用二进制编写的“传统”方式 是大端吗?

例如,二进制中的数字 1:

0b00000001 // Let's assume its possible to write numbers like that in code and b means binary

另外,当我在我的代码中写一个常量 0b00000001 时,无论机器是大端还是小端,它总是引用整数 1,对吗?

在这种表示法中,LSB 总是写成从右边算起的最后一个元素,而 MSB总是写成最左边的元素,对吗?

【问题讨论】:

  • 二进制文件前面没有0x
  • 文字 0x00000001hexa-decimal 表示法,而不是二进制。不过,它仍然是一个 1。在代码中编写文字时,字节顺序并不重要。
  • @JoachimPileborg:改变了问题,也许你现在可以看看。出于某种原因,我把事情弄糊涂了,并认为我可以直接将二进制数作为一个值(就像我之前写的那样)
  • 如果你要编写实际的二进制文件,你需要一个BOM
  • @AlexW:目前我没有在磁盘上写任何东西,这只是表示,请看问题

标签: c binary bit


【解决方案1】:

是的,人类通常以大端顺序编写数字(意味着首先写入的数字具有最高有效值),接受数字的常见编程语言以相同的方式解释它们。

因此,数字“00000001”表示一;它绝不意味着一亿(十进制)或 128(二进制)或其他基数的相应值。

大部分 C 语义都是根据数字的 编写的。一旦将数字转换为值,C 标准就会描述该值如何相加、相乘,甚至表示为位(对有符号值有一定的宽容度)。通常,该标准没有指定这些位如何存储在内存中,这就是机器表示中的字节序发挥作用的地方。当代表一个值的位被分组为字节并将这些字节存储在内存中时,我们可能会看到这些字节在不同的机器上以不同的顺序写入。

但是,C 标准指定了一种解释源代码中数字的通用方式,并且这种解释总是大端的,因为最高有效数字首先出现。

【讨论】:

  • 是的,主要是我对此感兴趣,所以在代码中 0b00000001 总是意味着 1..(嗯,是的,我认为你的最后两句话完全回答了我的问题)
【解决方案2】:

如果你想这样说,那么是的,我们人类以 Big-Endian 顺序书写数字。 但是我认为您对使用 big endian 或 little endian 的目标 runnign 有误解。

在您的实际 C 代码中,您的目标机器使用哪种字节序并不重要。例如,无论系统的字节序如何,这些行都将始终显示相同:

 uint32 x = 0x0102;
 printf("Output: %x\n",x); // Output: 102

或者以你为例:

 uint32 y = 0b0001;
 printf("Output: %d\n",y); // Output: 1

但是内存中的数据存储在 Little Endian 和 Big Endian 之间是不同的。

大端:

Actual Value: 0x01020304
Memory Address: 0x00 0x01 0x02 0x03
Value:          0x01 0x02 0x03 0x04

小端:

Actual Value: 0x01020304
Memory Address: 0x00 0x01 0x02 0x03
Value:          0x04 0x03 0x02 0x01

两次实际值都是 0x01020304(这是您在 C 代码中指定的值)。

如果您进行内存操作,您只需要担心它。如果您有一个 4 字节 (uint8) 数组,它表示一个 32 位整数,并且您想将其复制到您需要注意的 uint32 变量中。

uint8 arr[4] = {0x01, 0x02, 0x03, 0x04};
uint32 var;
memcpy(&var,arr,4);
printf("Output: %x\n",var); 
// Big Endian: Output: 0x01020304
// Little Endian: Output: 0x04030201

【讨论】:

  • 除了内存操作之外,可能受到影响的领域还包括网络通信和文件 I/O。这就是为什么正确的序列化(编组、酸洗)很重要的原因,也是过度思考(或思考不足)问题的人的大量错误的来源。
猜你喜欢
  • 2018-12-11
  • 1970-01-01
  • 1970-01-01
  • 2012-10-03
  • 1970-01-01
  • 2021-07-25
  • 2014-01-19
  • 1970-01-01
  • 2011-04-06
相关资源
最近更新 更多