我对 C 中的 stdint.h 的概念有点熟悉。通过明确说明整数的大小,头文件将用该机器上的适当整数替换 #define 整数。例如,如果我的机器有 16 位无符号整数,uint32_t
则将替换为long unsigned int
.
但是,假设您的机器最多只支持 32 位整数。如果你使用 会发生什么int64_t
?如果本机不支持此整数大小,那么由于没有可以修复它的替换,这将如何解决?
编译器会抛出错误,说它无法解决吗?还是会尝试使用两个 32 位分配来保存 64 位数据类型?
如果不支持某个 stdint 类型,则代码将无法编译。您可以像这样检查它们是否受支持:
#include <stdint.h>
#ifndef UINT64_MAX
#error uint64_t not supported
#endif
如果您的编译器支持某种类型但您的 CPU 不支持,则意味着某些编译器库代码将被静默调用以模拟更大的类型。
例如,如果您uint32_t
在 8 位微控制器上使用,编译器往往会支持它,但由于该类型仅通过软件模拟,因此生成的机器代码会变得又大又慢。
计算机(处理器)不限制整数类型的高位宽度。编译器施加了限制。硬件确实会影响处理大整数类型的复杂性和效率。只要有足够的时间和内存,即使是1 位平台也可以进行 64 位数学运算。
兼容的 C 编译器(C99 及更高版本)支持至少高达 64 位的整数宽度。
是的,32 位机器通常使用一对 32 位内部对象来处理 64 位操作。
要清楚。C99 编译器需要处理一些至少64 位的整数类型来实现所需的long long
. 一个平台可以实现也可以实现uint64_t
,64 位宽度,无填充,2 的补码整数类型。它非常普遍地实施。
unsigned long long ull; // must exist
#include <stdint.h>
uint_least64_t uleast64; // must exist
uint64_t u64; // may exist
在特定 C 实现中声明的精确宽度类型stdint.h
(作为typedef
s,而不是宏)都是可选的。只有当它们实际上提供了具有所需特性的数据类型时,实现才需要声明它们。
在您的特定示例中,如果所讨论的 C 实现不提供 64 位、二进制补码整数类型且没有填充位,则它stdint.h
不会声明 type int64_t
。如果您随后使用该类型而不自己声明它,编译器将拒绝您的代码。
需要提供的其他一些类型stdint.h
;符合要求的实现肯定会提供它们。对于可选的,您可以通过测试是否定义了它们的限制的相应宏(例如INT64_MAX
)来测试编译器是否提供它们。