[英]Overflow behaviour of fast types from stdint.h
C99和C ++ 11(以及POSIX之前的POSIX)在stdint
标头中引入了least
和fast
类型,例如int_fast16_t
或uint_fast8_t
。
我想知道如何保证这些类型的溢出行为。 如果这些与“普通”整数类型相同(以便无符号类型在溢出时回绕),我想知道uint_fast8_t
实际上如何可以映射到与fixed-witdh uint8_t
类型不同的任何类型,从而更快。
溢出规则与任何有符号/无符号整数变量相同。
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");
}
如果这些与“普通”整数类型相同(以便无符号类型在溢出时环绕)
保证是完全一样的。 有符号整数将溢出,而无符号整数将环绕。 可以表示的最大值取决于该类型是别名的整数类型。
我想知道如何将uint_fast8_t实际映射到与fixed-witdh uint8_t类型不同的任何类型
它可以是任何至少8位宽的无符号整数类型的别名。
C11 n1570表示
typedef名称
int_fastN_t
指定宽度至少为N的最快带符号整数类型。 类型定义名称uint_fastN_t
指定最快的无符号整数类型,其宽度至少为N。
因此,不能保证任何行为。 这些意思是int_fastN_t
一定不能在2^(n-1) - 1
... 2^(n-1) - 1
范围内签名溢出; 对于小于2^n - 1
值, uint_fastN_t
不得包含环绕。 如果您需要更精确的环绕行为,请不要使用快速类型,而应使用确切的宽度类型(即intN_t
和uintN_t
)。
我想知道如何将
uint_fast8_t
实际映射到与固定宽度uint8_t
类型不同的任何类型,从而更快。
首先,不必是 uint8_t
类型。 在36位字寻址的机器(它们已经存在)上,一个char
可能为9位宽。 ( 字寻址意味着自然的访问内存的方式是用字 (一定大小)。对一个字的子节进行寻址需要移位和屏蔽,而寻址这些子节的指针需要附加的位来引用该子单元。字内。)
在这样的机器上,编译器作者会做出一个有趣的决定,即使uint_fast8_t
与unsigned char
(9位)还是36位unsigned int
类型相同。
正如其他人所说的,将有一个实现定义的这些类型的最大值,如果超出该限制,则未签名的类型将自动换行,并且已签名的类型将导致未定义的行为。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.