如果我理解的话,int_fast_n_t
类型保证长度至少为n
位。根据编译器和计算机的体系结构,这些类型也可以在n
位以上定义。例如,int_fast_8_t
可以解释为32位int
。
是否有某种机制强制int_fast_n_t
的值永远不会溢出,即使真正的类型定义超过n
位?
请考虑以下代码:
int main(){
int_fast8_t a = 64;
a *= 2; // -128
return 0;
}
我不希望a
大于127
。如果a
被解释为“常规”int
(32位),a
是否可能超过127
并且不等于-128
?< / p>
感谢您的回答。
答案 0 :(得分:2)
结果绝对有可能超过127. int_fast8_t
(和uint_fast8_t
以及所有其余的)为该值设置一个明确的最小大小,但它可能更大,编译器将不要阻止它超出规定的8位边界(它的行为与它所代表的更大的类型完全相同,&#34; 8&#34;它在运行时并不相关),只保证它绝对可以代表所有的值在所述8位范围内。
如果需要它显式截断/换行到8位值,可以使用(或强制转换)int8_t
来限制可表示的范围(尽管overflow wouldn't be defined),或明确使用掩码来执行同样需要你自己工作。
答案 1 :(得分:2)
a * 2
如果a被解释为&#34;常规&#34; int(32位),是否可能超过127且不等于-128?
是。很可能a
将int_fast_n_t
保存为128.除非处理器是8位处理器,否则我希望在所有处理器上都这样。
是否有某种机制强制
int8_t
的值永远不会溢出?
没有。仍然可以使用有符号整数溢出以及[-128 ... 127]范围之外的值。
我不希望a大于127
使用int8_t
。值保存永远不会超过127,但在将128设置为int8_t a = 64;
a *= 2;
时,代码仍然具有实现定义的行为。这通常会导致-128(值换行模256),但其他值也是可能的(这是不常见的)。
int8_t
如果int_fast8_t a = foo(); // a takes on some value
a %= 256;
if (a < -128) a += 256;
else if (a > 127) a -= 256;
的分配不可用或具有意外的实现定义行为,代码可能会强制包装本身:
ListView
答案 2 :(得分:1)
不。所有快速类型都是typedef。例如,我机器上的stdint.h包含
/* Fast types. */
/* Signed. */
typedef signed char int_fast8_t;
#if __WORDSIZE == 64
typedef long int int_fast16_t;
typedef long int int_fast32_t;
typedef long int int_fast64_t;
#else
typedef int int_fast16_t;
typedef int int_fast32_t;
__extension__
typedef long long int int_fast64_t;
#endif
/* Unsigned. */
typedef unsigned char uint_fast8_t;
#if __WORDSIZE == 64
typedef unsigned long int uint_fast16_t;
typedef unsigned long int uint_fast32_t;
typedef unsigned long int uint_fast64_t;
#else
typedef unsigned int uint_fast16_t;
typedef unsigned int uint_fast32_t;
__extension__
typedef unsigned long long int uint_fast64_t;
#endif
在没有显着性能损失的情况下,最接近的可能是将结果转换为8位类型。
答案 3 :(得分:1)
如果你想操作8位(unsigned char是一个字节长)你只需要使用unsigned char,你将使用0到0xFF(255)无符号范围
答案 4 :(得分:1)
来自C(99)standard:
typedef name intN_t指定宽度为N的有符号整数类型 ,没有填充位和二进制补码表示。因此,int8_t 表示有符号整数类型,宽度恰好为8位。
因此使用int8_t
来保证8位int。
POSIX平台上兼容的C99 / C11编译器必须具有int8_t
。