我们可以说我们的“传统”二进制写作方式 是Big Endian吗?
例如,二进制数字1:0b00000001 // Let's assume its possible to write numbers like that in code and b means binary
同样,当我在代码中写一个常量0b00000001
时,无论机器是大端还是小端,这总是指整数1?
在这种表示法中, LSB总是写为右边的最后一个元素,而MSB 总是写成最左边的元素吗?
答案 0 :(得分:1)
是的,人类通常以大端顺序写数字(意味着首先写的数字具有最重要的值),并且接受数字的通用编程语言以相同的方式解释它们。
因此,数字“00000001”表示一个;它绝不意味着一亿(十进制)或128(二进制)或其他基础中的相应值。
大部分C语义都是根据数字的值来编写的。一旦数字被转换为值,C标准描述了如何将该值添加,相乘,甚至表示为位(具有关于有符号值的一些纬度)。通常,标准没有规定这些位如何存储在存储器中,这是机器表示中的字节顺序发挥作用的地方。当表示值的位被分组为字节并且这些字节存储在存储器中时,我们可能会在不同的机器上看到以不同顺序写入的那些字节。
然而,C标准规定了在源代码中解释数字的常用方法,并且在最有效数字首先出现的意义上,该解释总是大端的。
答案 1 :(得分:1)
如果你想这样说,那么是的,我们人类以Big-Endian的顺序写数字。 但是我认为你对你的目标runnign有大或小端的误解。
在您的实际C代码中,目标机器使用哪个字节顺序并不重要。例如,无论系统的结束性如何,这些行都将始终显示相同的内容:
uint32 x = 0x0102;
printf("Output: %x\n",x); // Output: 102
或举个例子:
uint32 y = 0b0001;
printf("Output: %d\n",y); // Output: 1
然而您的内存中的数据存储在Little和Big Endian之间有所不同。
Big Endian:
Actual Value: 0x01020304
Memory Address: 0x00 0x01 0x02 0x03
Value: 0x01 0x02 0x03 0x04
Little Endian:
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