我读了很多关于最快最小宽度整数类型的解释,但我不知道何时使用这些数据类型。
我的理解: 在32位机器上,
uint_least16_t可以是无符号短文的typedef。
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的typedef。
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.
答案 0 :(得分:1)
uint_fast16_t
只是最快的无符号数据类型,至少有16位。在某些机器上它将是16位,在其他机器上它可能更多。如果你使用它,你应该小心,因为给出高于0xFFFF的结果的算术运算可能在不同的机器上有不同的结果。
在某些机器上,是的,你可以在其中存储大于0xFFFF的数字,但你不应该依赖于你的设计中的那个,因为在其他机器上它是不可能的。
通常,uint_fast16_t
类型将是uint16_t
,uint32_t
或uint64_t
的别名,您应该确保代码的行为不依赖于使用哪种类型。
我想说如果你需要编写快速和跨平台的代码,你应该只使用uint_fast16_t
。大多数人应该坚持使用uint16_t
,uint32_t
和uint64_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,因此函数可能会返回真或假。现在,如果您可以证明a
和b
永远不会求和大于0xFFFF的数字,或者如果您可以证明bad_foo
的结果在这些情况下被忽略,那么代码没问题。
相同代码的更安全实现(我认为)在所有机器上的行为方式应该相同:
bool good_foo(uint_fast16_t a, uint_fast16_t b)
{
uint_fast16_t sum = a + b;
return (sum & 0xFFFF) > 0x8000;
}