我正在尝试记录不同的数据类型以及它们是如何存储在C中的内存中的。我知道每个数据类型占用多少字节,但我想知道每种数据类型的endianness是如何的。这是专门针对Windows的。
端序(通常(是硬件的函数,而不是操作系统或语言,因此所有多字节类型都应该具有相同的端序。
强调应该。
对于x86和x86_64(Windows主要在其上运行(,所有多字节类型都是小端序。
但总会有一些奇怪的平台。DEC VAX是小端序,但浮点类型除外,它们以大端和小端的组合顺序存储。来自Kapps&斯塔福德1:
VAX的设计部分是为了与PDP-11计算机兼容。PDP-11是一个16位机器,32位和64位浮点数字存储为16位字的序列,最高有效部分位于第一位。这对VAX来说是不幸的,因为VAX几乎普遍将最不显著的部分放在第一位。浮点数字是这个规则的主要例外。因此,当F_floating数存储在长字中时,我们必须将前16位与后16位反转
IOW,每个16位字都是大端序(字节顺序01
(,但16位字的序列是小端序,因此32位F_float
的字节顺序是2301
。
至于字体大小。。。
C没有指定";传统的";标量类型,如int
、long
、float
、double
等。它指定了每个类型必须能够表示的最小值范围。char
必须能够表示基本执行字符集中的所有字符,这意味着它必须至少8位宽,但它可能更宽(9位字节和36位字是一种东西,或者至少过去是这样(。int
必须能够表示中至少范围-32767..32767
的值,这意味着它必须至少16位宽。
- Kapps,Charles A.和Robert L.Stafford,VAX汇编语言和体系结构,Prindle,Weber&Schmidt 1985
我知道每种数据类型占用的字节数
这是不可能的。C没有为它的任何类型定义大小。它只提供最低限度。例如,int
的大小只需要16位,但它通常会更大。这可能因编译器和操作系统而异。
我想知道每个数据类型的字节序是如何的。
C也没有定义这一点。这将取决于系统的硬件。例如,x86和x86_64是小端序。ARM是big-endian。一些旧系统使用的字节顺序与这两种系统不同。