1

我对 C 中的 stdint.h 的概念有点熟悉。通过明确说明整数的大小,头文件将用该机器上的适当整数替换 #define 整数。例如,如果我的机器有 16 位无符号整数,uint32_t则将替换为long unsigned int.

但是,假设您的机器最多只支持 32 位整数。如果你使用 会发生什么int64_t?如果本机不支持此整数大小,那么由于没有可以修复它的替换,这将如何解决?

编译器会抛出错误,说它无法解决吗?还是会尝试使用两个 32 位分配来保存 64 位数据类型?

4

3 回答 3

5

如果不支持某个 stdint 类型,则代码将无法编译。您可以像这样检查它们是否受支持:

#include <stdint.h>

#ifndef UINT64_MAX
#error uint64_t not supported
#endif

如果您的编译器支持某种类型但您的 CPU 不支持,则意味着某些编译器库代码将被静默调用以模拟更大的类型。

例如,如果您uint32_t在 8 位微控制器上使用,编译器往往会支持它,但由于该类型仅通过软件模拟,因此生成的机器代码会变得又大又慢。

于 2017-01-12T15:59:18.823 回答
2

计算机(处理器)不限制整数类型的高位宽度。编译器施加了限制。硬件确实会影响处理大整数类型的复杂性和效率。只要有足够的时间和内存,即使是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 
于 2017-01-12T15:56:20.147 回答
1

在特定 C 实现中声明的精确宽度类型stdint.h(作​​为typedefs,而不是宏)都是可选的。只有当它们实际上提供了具有所需特性的数据类型时,实现才需要声明它们。

在您的特定示例中,如果所讨论的 C 实现不提供 64 位、二进制补码整数类型且没有填充位,则它stdint.h不会声明 type int64_t。如果您随后使用该类型而不自己声明它,编译器将拒绝您的代码。

需要提供的其他一些类型stdint.h;符合要求的实现肯定会提供它们。对于可选的,您可以通过测试是否定义了它们的限制的相应宏(例如INT64_MAX)来测试编译器是否提供它们。

于 2017-01-12T16:04:59.540 回答