C语言 需要澄清(u/i)int_fastN_t



我读了很多关于最快的最小宽度整数类型的解释,但我不明白什么时候使用这些数据类型

我的理解:在32位机器上,

uint_least16_t可以被定义为unsigned short类型。

 1. uint_least16_t small = 38;
 2. unsigned short will be of 16 bits so the value 38 will be stored using 16 bits. And this will take up 16 bits of memory.
 3. The range for this data type will be 0 to (2^N)-1 , here N=16.

uint_fast16_t可以被类型定义为unsigned int类型。

 1. uint_fast16_t  fast = 38; 
 2. unsigned int will be of 32 bits so the value 38 will be stored using 32 bits. And this will take up 32 bits of memory.
 3. what will be the range for this data type ?
    uint_fast16_t => uint_fastN_t , here N = 16
    but the value can be stored in 32 bits so IS it 0 to (2^16)-1 OR 0 to (2^32)-1 ?
    how can we make sure that its not overflowing ? 
    Since its a 32 bit, Can we assign >65535 to it ?
    If it is a signed integer, how signedness is maintained.
    For example int_fast16_t = 32768;
    since the value falls within the signed int range, it'll be a positive value.

uint_fast16_t是最快的无符号数据类型,至少有16位。在一些机器上,它将是16位,而在其他机器上可能更多。如果您使用它,您应该小心,因为在不同的机器上给出高于0xFFFF的结果的算术运算可能会有不同的结果。

在某些机器上,是的,您可以在其中存储大于0xFFFF的数字,但您不应该在设计中依赖于这一点,因为在其他机器上这是不可能的。

一般来说,uint_fast16_t类型将是uint16_t, uint32_tuint64_t的别名,并且您应该确保代码的行为不依赖于使用的类型。

我想说,如果你需要编写既快速又跨平台的代码,你应该只使用uint_fast16_t。大多数人应该坚持使用uint16_tuint32_tuint64_t,这样在将代码移植到另一个平台时就会有更少的潜在问题需要担心。

一个例子

下面是一个你可能会遇到麻烦的例子:

bool bad_foo(uint_fast16_t a, uint_fast16_t b)
{
    uint_fast16_t sum = a + b;
    return sum > 0x8000;
}

如果您将a作为0x8000, b作为0x8000调用上面的函数,那么在某些机器上sum将为0,而在其他机器上它将为0x10000,因此该函数可能返回true或false。现在,如果你能证明ab的和永远不会大于0xFFFF,或者如果你能证明在这些情况下bad_foo的结果被忽略,那么这段代码就可以了。

相同代码的一个更安全的实现,(我认为)应该在所有机器上表现相同,将是:

bool good_foo(uint_fast16_t a, uint_fast16_t b)
{
    uint_fast16_t sum = a + b;
    return (sum & 0xFFFF) > 0x8000;
}

相关内容

  • 没有找到相关文章

最新更新