2016-05-13 28 views
1

C99和C++ 11(以及它们之前的POSIX)在stdint报头中引入了leastfast类型,例如, int_fast16_t或。来自stdint.h的快速类型的溢出行为

我不知道什么保证了这些类型的溢出行为。如果这些与“正常”整数类型相同(以便无符号类型在溢出时环绕),我不知道如何将实际上映射到与固定类型不同的任何类型,因此速度更快。

+0

的[什么是 “INT” 之间的区别和 “INT \ _fast16 \ _t”?]可能的复制(http://stackoverflow.com/questions/30942107/whats-the-difference-between-int-and-int -fast16-T) –

+0

@KlasLindbäck则存在问题或答案中没有提到这个词溢出。 –

回答

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)。

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

如果这些是一样的“普通”整型(使无符号类型环绕在溢出)

的保证是完全一样的。有符号的整数将溢出,并且无符号的将循环。可以表示的最大值取决于该类型是哪个整数类型的别名。

不知如何uint_fast8_t实际上可以映射到任何不同的类型固定witdh uint8_t型

它可以是宽至少8位的任何无符号整数类型的别名。

1

不知如何实际上可以映射到任何类型不同于固定宽度uint8_t型,因而更快。

首先,有不必一个uint8_t类型。在36位寻址字机(它们已经存在),一个char很可能是9个位宽。 (字寻址意味着要访问存储器中的自然的方式是在词语(某些大小的)。寻址一个字的子部分需要移位和掩蔽,和指针哪个地址这样的子段需要额外的位来指字内的子单元。)

在这样的机器中,编译器作者将具有有趣决定是否使是相同的unsigned char(9个比特)或36位unsigned int类型。

正如其他人所说,将有一个实现定义的最大这些类型的,如果超过该限制的无符号类型将包装和签名的类型将导致不确定的行为。

+0

在一个字寻址的机'的sizeof(int)的'可合理'1',使得'char'有一样多的位的字。 *您可以使*'char'更小,并使用屏蔽/在过去的转移,但今天你想要多处理器机器,C11的担保原子访问对象使屏蔽/移不切实际的。 – EOF

+0

这是另一个可行的实施,是的。 (PDP 10当然不是多核的。) –