来自stdint.h的快速类型的溢出行为

时间:2016-05-13 08:23:20

标签: c++ c c++11 c99

C99和C ++ 11(以及它们之前的POSIX)在least标题中引入了faststdint类型,例如int_fast16_tuint_fast8_t

我想知道这些类型的溢出行为的保证是什么。如果这些与"正常"相同整数类型(以便无符号类型在溢出时回转),我想知道uint_fast8_t如何实际映射到与fixed-witdh uint8_t类型不同的任何类型,因此更快。

4 个答案:

答案 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_tuintN_t)。

答案 3 :(得分:1)

  

我想知道uint_fast8_t如何实际映射到固定宽度uint8_t类型的任何不同类型,因此更快。

首先,没有 uint8_t类型。在36位字寻址机器上(它们已经存在),char可能是9位宽。 ( Word寻址意味着访问内存的自然方式是单词(某种大小)。寻址单词的子部分需要移位和屏蔽,以及指向地址的指针这些子部分需要额外的位来指代单词中的子单元。)

在这样的机器上,编译器作者会有一个有趣的决定,即是否uint_fast8_tunsigned char(9位)或36位unsigned int类型相同。

正如其他人所说,将会有一个实现定义了这些类型的最大值,如果超过该限制,则无符号类型将换行,签名类型将导致未定义的行为。