我对C中stdint.h的概念有点熟悉。通过明确说明整数的大小,头文件将用该机器上的相应整数替换#define整数。例如,如果我的机器有16位无符号整数,则uint32_t
将替换为long unsigned int
。
但是,假设您的机器最多只支持32位整数。如果您使用int64_t
会发生什么?如果本机不支持此整数大小,那么如何解决这个问题,因为没有可以解决它的替换?
编译器会抛出错误并说它无法解析吗?或者它会尝试使用两个32位分配来保存64位数据类型吗?
答案 0 :(得分:5)
如果不支持某个stdint类型,则代码不会编译。您可以检查它们是否受支持:
#include <stdint.h>
#ifndef UINT64_MAX
#error uint64_t not supported
#endif
如果您的编译器支持某种类型但CPU不支持,则意味着将以静默方式调用某些编译器库代码来模拟更大的类型。
例如,如果在8位微控制器上使用uint32_t
,编译器倾向于支持它,但由于该类型仅通过软件模拟,因此生成的机器代码将变得越来越大。
答案 1 :(得分:2)
计算机(处理器)不限制整数类型的高位宽度。编译器强加限制。硬件确实会影响处理大整数类型的复杂性和效率。如果有足够的时间和内存,即使1-bit platform也可以进行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
答案 2 :(得分:1)
在特定C实现的stdint.h
(作为typedef
,而不是宏)中声明的精确宽度类型都是可选的。只有当它们实际上提供具有所需特征的数据类型时,才需要实现它们。
在您的特定示例中,如果所讨论的C实现不提供没有填充位的64位二进制补码整数类型,则其stdint.h
将不会声明类型int64_t
。如果您在没有自己声明的情况下使用该类型,编译器将拒绝您的代码。
stdint.h
提供的其他类型的其他类型是必需的;符合要求的实施肯定会提供它们。对于可选项,您可以通过测试是否定义了相应的限制宏来测试编译器是否提供了它们(例如INT64_MAX
)。