-1

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

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

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

typedef unsigned int FastInteger16;
typedef unsigned long FastInteger32;

这有什么问题吗?

4

2 回答 2

2

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

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

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

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

于 2013-01-21T16:31:42.777 回答
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是符合实现的无符号 32 位类型。由于它不在unsigned long您的实施中,因此几乎可以肯定unsigned int. 这两种类型unsigned longunsigned int是不同的类型,即使它们的大小相同。相比之下,uint32_t是一个 typedef,所以它与 typedef 所指的任何类型都是相同的。

要回答您的新问题:

typedef unsigned short Integer16;

unsigned short可能不完全是 16 位(尽管它不是很多实现)。如果您想要一个精确的 16 位无符号类型,那么这就是uint16_t目的。它是一种可选类型,因此在没有合适类型的实现上,您的代码将导致信息错误,这几乎可以做到。

typedef std::uint32_t Integer32;

好的,警告uint32_t是可选类型。如果你喜欢这个名字Integer32,那么你可以自由使用它。

typedef unsigned int FastInteger16;

如果您想要一个至少 16 位的快速无符号整数,请使用std::uint_fast16_t而不是。unsigned int

typedef unsigned long FastInteger32;

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

于 2013-01-21T17:20:52.133 回答