最小宽度整数类型有什么用途?

6

来自ISO/IEC 9899:

7.18.1.2 最小宽度整数类型

1 typedef名称int_leastN_t指定一个带有至少N位宽度的带符号整数类型,使得没有小于指定宽度的带符号整数类型具有至少该宽度。 因此,int_least32_t表示带有至少32位位宽的带符号整数类型。

我为什么要使用这些类型?

当我决定需要哪种类型的变量时,我会问自己:“它可能携带的最大值是多少?”

然后我会找到答案,查看比该值更大的最低2的n次幂,并选择相匹配的确切整数类型。

因此,在这种情况下,我也可以使用最小宽度整数类型。 但是为什么呢?正如我已经知道的那样:它永远不会是更大的值。为什么要采用可能有时甚至超过我所需的东西呢?

我可以想象其他所有情况,包括无效情况,例如:

“我有一个类型,其大小至少为...” - 实现不知道我将获得最大的用户输入是什么,因此在编译时调整类型无法帮助。

“我有一个变量,在运行时无法确定它将容纳多大的值。”

-那么编译器如何在编译时知道呢?-> 它也无法找到适合的字节大小。

那么这些类型的用途是什么?

2个回答

5

那为什么要使用有时可能超过我需要的类型?

因为你需要的尺寸可能并不总是可用的。例如,在CHAR_BIT > 8的系统上,int8_t不可用,但是int_least8_t可用。

思路不是编译器会猜测你需要多少位。而是编译器始终会提供一种满足你尺寸需求的类型,即使它不能提供精确大小的类型。


那么如果charbit是10,是否会有一个uint10_t的情况呢?所以这只是为了可移植性,我不需要自己检查CHAR_BIT的值,也不必进行相应的iofdefs吗?在实践中是否存在CHAR_BIT大于8的系统? - dhein
3
非二补码系统中,所有的 intN_t 类型都是可选的。因此它们对于可移植代码并不是真正有用的。但是,uint10_t 是标准允许的(N1570: 7.20.1.1.2)。我相信存在一些 CHAR_BIT > 8 的系统,但我无法记起它们在今天的相关性如何。 - user694733
1
现在的系统CHAR_BIT > 8主要是DSPs。https://dev59.com/mnI95IYBdhLWcg3w5iY4?lq=1 - phuclv

5
因为你的编译器最清楚对你有什么好处。例如,在某些CPU体系结构中,涉及8位或16位类型的计算可能比在32位中进行的计算慢得多,因为需要额外的指令来掩盖操作数和结果以匹配其宽度。
例如,在Cray Unicos上的C实现中,只有8位char类型,其他所有类型(short、int、long、long long)都是64位。如果你强制将类型设置为int16_t或int32_t,则由于窄存储需要掩码、或运算和与运算,性能会受到严重影响。使用int_least32_t将允许编译器使用本机64位类型。

点赞以表示编辑支持。如果没有其他选择,我没有意识到“intN_t”类型确实可以在软件中模拟。 - user694733
4
为什么我应该在这种情况下使用int_least32_t而不是int_fast32_t? - dhein
@Zaibis 因为空间效率可能比速度更重要。 - Jens
1
但可能不存在int32_t; 只需要最小和最快的类型。我应该更清楚:当速度是您的优先考虑因素时,请使用快速类型;当空间是您的优先考虑因素时,请使用最小值。 - Jens
@Jens:编译器需要实现“least”和“fast”类型的哪些大小?编译器是否需要实现uint_least1_tuint_least2_tuint_least3_t等一直到uint_least64_t - supercat
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接