stdint.h中的C ++标准类型大小

时间:2013-01-21 16:23:08

标签: c++

我正在使用std :: uint32_t,由于某种原因,这是一个与unsigned long不同的数据类型,这是我平台上的无符号32(ARM Cortex M4 K20)......有什么想法吗?

没关系我猜有时你想要可变大小的类型:

typedef unsigned short Integer16;
typedef std::uint32_t Integer32;

typedef unsigned int FastInteger16;
typedef unsigned long FastInteger32;

有任何问题吗?

2 个答案:

答案 0 :(得分:2)

类型std::uint32_t应该是32位和无符号整数。

但这意味着它可以是unsigned intunsigned long 这些值可能都是32位长(取决于实现)。

  

或者禁止以任何方式定义告诉我std :: uint32_t是不是32位所以我可以有条件地重新定义基本类型?

类型std::uint32_t定义为32位。此类型是可选的,如果您的平台没有32位无符号整数类型,则不可用。

答案 1 :(得分:1)

您想要的代码是:

#if (typeid(std::uint32_t) == typeid(unsigned long))
    typedef unsigned long Integer32;
#else 
    typedef std::uint32_t Integer32;

这不合法,但您要说的是,换句话说,如果uint32_t表示unsigned long,那么Integer32就意味着unsigned long uint32_t。否则,它意味着typedef std::uint32_t Integer32; 意味着"。

相当于:

Integer32

因为在这两种情况下,您将uint32_t别名化为uint32_t所指的相同类型。所以写下来。

保证unsigned long是符合实现的无符号32位类型。由于您的实施不是unsigned int,因此几乎可以肯定unsigned long。这两种类型unsigned intuint32_t是不同的类型,即使它们的大小相同。相比之下,typedef unsigned short Integer16; 是一个typedef,所以它的类型与它所要求的类型相同。

回答你的新问题:

unsigned short

uint16_t可能不完全是16位(尽管没有很多实现,但它不是)。如果你想要一个精确的16位无符号类型,那么typedef std::uint32_t Integer32; 是什么。它是一种可选类型,因此在没有合适类型的实现中,您的代码将导致信息错误,这几乎与您可以做的一样。

uint32_t

好的,警告Integer32是可选类型。如果您更喜欢名称typedef unsigned int FastInteger16; ,那么您可以自由使用它。

std::uint_fast16_t

如果你想要一个至少16位的快速无符号整数,请使用unsigned int而不是typedef unsigned long FastInteger32;

std::uint_fast32_t

如果您想要一个至少32位的快速无符号整数,请使用unsigned long而不是{{1}}。