C 原语可以比 void* 更宽吗?
Can a C primitive be wider than a void*?
我知道 void*
可以容纳任何指针,但我也想知道通过强制转换它是否可以容纳数组或结构以外的任何东西,即基元和联合。这是 C 的保证(如果是的话是哪个版本)或者只是特定于实现或者甚至不是一件事?
I wonder also if with casting it can hold anything besides an array or a struct, i.e., primitives and unions. Is this a guarantee with C [...]?
不,不是。作为反例,指针在 32 位 CPU 的 C 实现中通常为 32 位宽,* 但 C 要求类型 long long int
至少为 64 位宽。** C 对任何算术类型的大小都没有上限,对任何指针类型的大小也没有(显式)下限,因此原则上,即使 short
也可能比void *
.
*例如GCC uses the pointer representation specified by the target application binary interface (ABI). On x86 Linux, that means the x86 System V ABI, which defines the size of an address as 4 bytes.
** 根据当前 C 语言标准的第 5.2.4.2.1/1 段,类型 long long int
的对象可表示的最大值必须位于至少 9223372036854775807
,即 263 - 1。如果您也包含符号位,那么 long long int
至少需要 64 位。
我知道 void*
可以容纳任何指针,但我也想知道通过强制转换它是否可以容纳数组或结构以外的任何东西,即基元和联合。这是 C 的保证(如果是的话是哪个版本)或者只是特定于实现或者甚至不是一件事?
I wonder also if with casting it can hold anything besides an array or a struct, i.e., primitives and unions. Is this a guarantee with C [...]?
不,不是。作为反例,指针在 32 位 CPU 的 C 实现中通常为 32 位宽,* 但 C 要求类型 long long int
至少为 64 位宽。** C 对任何算术类型的大小都没有上限,对任何指针类型的大小也没有(显式)下限,因此原则上,即使 short
也可能比void *
.
*例如GCC uses the pointer representation specified by the target application binary interface (ABI). On x86 Linux, that means the x86 System V ABI, which defines the size of an address as 4 bytes.
** 根据当前 C 语言标准的第 5.2.4.2.1/1 段,类型 long long int
的对象可表示的最大值必须位于至少 9223372036854775807
,即 263 - 1。如果您也包含符号位,那么 long long int
至少需要 64 位。