int_fast_类型和值溢出

时间:2018-02-20 22:31:23

标签: c

如果我理解的话,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>

感谢您的回答。

5 个答案:

答案 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?

是。很可能aint_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