Tanenbaum says整数被“逐字逐句”阅读,因此,
显然,整数在BE和LE中以相同的方式存储,而只有字符串是“逐字节”读取的。
然而,Endianness描述了单词的表示方式(source),意味着不同的endianness =不同的单词存储。那为什么会一样呢?
根据this问题,unsigned long long x = 0x0123456789ABCDEF
的存储方式不同:
01 23 45 67 89 AB CD EF // big endian vs
EF CD AB 89 67 45 23 01 // little endian
那是什么呢?整数(或数字,就此而言)是以不同的方式(逐字节)或相同的(完全)表示的吗?
答案 0 :(得分:1)
整数(或数字)是否以不同(逐字节)或相同(完全)表示?
C允许各种各样的编码 - 有些比其他编码更常见。然而,所有这些都受到一些规则的限制。
在图层中进行此操作,例如使用signed int
在二进制文件中,这将是111...111000000001
首先1
是符号位。
第1层:(位宽N
,值位M
)“ signed 整数占用N位。 signed 整数有一个符号位和M
值位以及0个或更多(稀有)填充位。这总计为N
。这三个组和位的顺序没有定义。而是像{{1}这样的操作},>>
是用抽象的数字规范定义的。例如,向左移动会使值加倍。+
的值会大大决定M
的范围。
int
第2层:( 2的补码,符号/幅度或1的补码)逻辑和普遍实现的是,值位按顺序排列,从最低有效位开始,值为1,下一位的值为2,然后是4,然后是8等。压倒性的公共2的补码布局中的符号位的值为-2 M 。其他布局主要是历史用途。
// common implementations.
int: N=32, M=31
int: N=16, M=15
第3层:字节宽度
// Common implementations include:
int: N=32, M=31, 2's complement
int: N=16, M=15, 2's complement
占用int
位,但位数/字节数(最小可寻址单位)通常是8位/字节,但其他存在,如16,64和历史9它必须至少为8.现在,考虑近似通用选择是8位/字节。
N
第4层:Endian。
对于多个字节的典型// Common implementations include:
int: N=32, M=31, 2's complement, 4 bytes
int: N=16, M=15, 2's complement, 2 bytes
代码,int
上的最低可寻址字节是否编码最低有效位或最大或其他?最常见的2个是 little endian 和 big endian ,如OP所示。其他罕见的端序存在。
int
实施例
值为-512时,第一个字节的值是多少?
作为二进制:// Common implementations include:
int: N=32, M=31, 2's complement, 4 bytes, big endian
int: N=32, M=31, 2's complement, 4 bytes, little endian
int: N=16, M=15, 2's complement, 2 bytes, little endian
,第一个数字作为符号位。
111...1110_00000001
答案 1 :(得分:0)
显然整数在BE和LE中以相同的方式存储
不,他们不是;这就是字节序的重点。是的,每个整数存储在4个字节中,但如果您要一次读取一个字节的4字节字,您会看到little-endian将最低有效字节放在第一位,而big-endian放置最重要的字节字节首先表示单个整数。
请查看问题中包含的long long
作为示例,另请参阅https://en.wikipedia.org/wiki/Endianness。
其他字节序是可能的,例如PDP-endian actually exists。从理论上讲,任何整数字节的加扰函数都是可能的,但除非你设计的是Deathstation-9000,否则没有理由做任何奇怪的事情。 (绝对是不做任何比大端或小端更奇怪的事情的原因,因为如果32位整数的一半的16位负载实际上得到低或高半,这是很好的,不是另外两个字节的混合。)