使用非固定整数(int、long)而不是固定大小的整数(int64_t、int32_t)有啥好处吗?

Posted

技术标签:

【中文标题】使用非固定整数(int、long)而不是固定大小的整数(int64_t、int32_t)有啥好处吗?【英文标题】:Is there any advantage of using non-fixed integers (int, long) instead of fixed-size ones (int64_t, int32_t)?使用非固定整数(int、long)而不是固定大小的整数(int64_t、int32_t)有什么好处吗? 【发布时间】:2012-12-22 15:31:17 【问题描述】:

也许是性能?我觉得使用非固定整数只会让程序更复杂,并且在移植到另一个架构时容易失败。

【问题讨论】:

我发现确切的大小在我的代码中非常重要——在这些情况下,使用固定大小的整数只会增加麻烦并降低可移植性。你在做什么需要你知道比特大小? 我认为这取决于您想要做出的假设。你想假设一个特定的值在任何架构上总是有准确的位数吗?如果是这样,固定大小的整数可能是正确的选择。如果没有,那么您可能只想使用一种保证一定最小位数的类型。 【参考方案1】:

std::intN_t 提供only if the implementation can directly support them。所以移植使用它们的代码可能会失败。

我更喜欢将std::intfastN_t 用于一般用途,因为它们的限制较少,并且应该与int 一样快或更快。

此外,大多数 C++ 代码在任何地方都使用int,因此在将std::int32_t 传递给接受int 的函数时,您可能会遇到提升怪异现象,尤其是当sizeof(int) 只有16 位时。

【讨论】:

uint_fast8_t 的行为是否像 uint8_t,例如。 255 + 1 = 0? @lamefun 不。它至少可以容纳 255 个,可能更多。如果您需要保证大小(大多数情况下很少见),请使用 uint8_t【参考方案2】:

许多 API 接受或返回非固定类型的值。例如,文件描述符的类型为int,文件偏移量或大小的类型为off_t,而strtol() 返回long。盲目地将这些值从固定大小类型转换为固定大小类型可能会导致某些机器上溢出。

【讨论】:

【参考方案3】:

保证宽度类型 (intN_t) 只是适当“标准”整数类型的 typedef。如果平台没有合适的类型(例如,它使用 36 位整数),那么它不能也不能提供保证宽度的 typedef。 这意味着性能几乎不能成为争论的焦点。

最大可移植性(在这方面)的一般准则是默认使用“标准”整数类型,并且仅当您的算法需要精确的位数时才使用保证宽度类型。 应该假设“标准”整数类型的宽度与相关标准所保证的一样宽(如果您只查看 C++ 标准,那将是:8 位 char、16 位 int、32-位 long,如果您的编译器支持,64 位 long long)。

【讨论】:

【参考方案4】:

如果您的数据类型的大小对其功能至关重要,那么您应该使用具有定义大小的类型。但是,例如一段代码完全在 [你可以合理期望的] int 范围内(例如 1 ... 1000 循环计数器),没有理由仅仅因为你想定义你的变量而使用 int_32t .它适用于 16、32、64、36、18 或 49 位整数,都一样。所以让编译器选择最好的大小。

编译器可能会为固定大小的整数生成更糟糕的代码,这些代码不是架构的“最佳选择”。

显然,通过网络或文件呈现的任何数据都需要具有固定大小。同样,如果您的接口需要跨接口边界的二进制兼容性,那么使用定义的大小类型对于避免大小成为问题非常有用。

【讨论】:

以上是关于使用非固定整数(int、long)而不是固定大小的整数(int64_t、int32_t)有啥好处吗?的主要内容,如果未能解决你的问题,请参考以下文章

GCC 中有固定大小的整数吗?

在C语言的变量类型说明中,int,char,float等类型的长度是不是是固定的?

Java:2D int数组的固定大小数组[重复]

java(而)变量

允许用户在我的类中定义数组大小而不是使用固定变量的最佳方法是啥,在这种情况下为 8

如何在 R 中对给定固定簇大小的 lat-long 进行聚类?