C99和C ++ 11(以及它们之前的POSIX)在least
标题中引入了fast
和stdint
类型,例如int_fast16_t
或uint_fast8_t
。
我想知道这些类型的溢出行为的保证是什么。如果这些与"正常"相同整数类型(以便无符号类型在溢出时回转),我想知道uint_fast8_t
如何实际映射到与fixed-witdh uint8_t
类型不同的任何类型,因此更快。
答案 0 :(得分:1)
溢出规则与任何有符号/无符号整数变量相同。
uint_fast16_t
映射到至少16位的最快大小。如果最快的大小恰好是平台上的32位,则行为会有所不同。考虑:
uint_fast16_t k = 1 << 16;
if (k == 0) {
printf("k is 16 bits\n");
} else {
printf("k is larger than 16 bits\n");
}
答案 1 :(得分:1)
如果这些与&#34;正常&#34;相同整数类型(以便无符号类型在溢出时回绕)
保证完全一样。有符号整数将溢出,无符号将环绕。可以表示的最大值取决于该类型为别名的整数类型。
我想知道如何将uint_fast8_t实际映射到与fixed-witdh uint8_t类型不同的任何类型
它可以是任何无符号整数类型的别名,至少为8位宽。
答案 2 :(得分:1)
C11 n1570说
typedef名称
int_fastN_t
指定具有宽度的最快有符号整数类型 至少 Ñ强> 。 typedef名称uint_fastN_t
指定最快的无符号整数 类型的宽度至少为 Ñ强>
因此没有保证这样的行为;这些说法是int_fastN_t
必须在2^(n-1) - 1
... 2^(n-1) - 1
范围内签名溢出;对于小于uint_fastN_t
的值,2^n - 1
不得包含。如果您需要更精确的环绕行为,请不要使用快速类型,而是使用确切的宽度类型(又名intN_t
和uintN_t
)。
答案 3 :(得分:1)
我想知道
uint_fast8_t
如何实际映射到固定宽度uint8_t
类型的任何不同类型,因此更快。
首先,没有 uint8_t
类型。在36位字寻址机器上(它们已经存在),char
可能是9位宽。 ( Word寻址意味着访问内存的自然方式是单词(某种大小)。寻址单词的子部分需要移位和屏蔽,以及指向地址的指针这些子部分需要额外的位来指代单词中的子单元。)
在这样的机器上,编译器作者会有一个有趣的决定,即是否uint_fast8_t
与unsigned char
(9位)或36位unsigned int
类型相同。
正如其他人所说,将会有一个实现定义了这些类型的最大值,如果超过该限制,则无符号类型将换行,签名类型将导致未定义的行为。