【问题标题】:Difference between different integer types不同整数类型之间的区别
【发布时间】:2012-08-02 21:32:27
【问题描述】:

我想知道uint32_tuint32 之间有什么区别,当我查看头文件时,它有这个:

types.h:

    /** @brief 32-bit unsigned integer. */
    typedef unsigned int uint32;
stdint.h:

    typedef unsigned   uint32_t;

这只会导致更多问题: 有什么区别

unsigned varName;

unsigned int varName;

?

我正在使用MinGW.

【问题讨论】:

  • 它们是一样的。但是,C99 标准没有定义类型 uint32(以及标题 <types.h> 或文件 "types.h")。如果您想使用其中一种类型,请使用uint32_t 并包含标题<stdint.h>unsignedunsigned int 也是一样的。
  • 那么 uint32 和 不是标准的一部分,但 uint32_t 是?
  • @user1507133:是的。基本上,在 C 和 C++ 中都没有 uint32 这样的东西。

标签: c++ c


【解决方案1】:

unsignedunsigned int由于历史原因是同义词;它们都表示“CPU 架构/平台最自然大小的无符号整数”,在现代平台上通常(但并非总是)32 位。

<stdint.h> 是 C99 中的标准头文件,它应该使用 uint32_t 命名约定为特定大小的整数提供类型定义。

您正在查看的<types.h> 似乎是非标准的,可能属于您的项目正在使用的某个框架。它的uint32 typedef 与uint32_t 兼容。您是否应该在代码中使用其中一个是您的经理的问题。

【讨论】:

  • " 是 C99 中的标准头文件"。 C++98 和 C++11 呢?
  • 我认为 <cstdint> 是等效的 C++ 标准头文件。
  • @user1507133 - C++11 有 将这些类型带入 std 命名空间(例如 std::uint32_t)。 C++98 没有这个头文件,因为它早于 C99。 POSIX 为inttypes.h 提供了相同的类型,如果这足够好的话。
  • 根据 C 标准,<inttypes.h> 包括 <stdint.h>。因此它“复制”了每个定义并提供了一些额外的定义(特别是 scanf 和 printf 说明符:printf("%" PRIu32 "\n", x);
【解决方案2】:

unsignedunsigned int 是同义词,很像 unsigned short [int]unsigned long [int]

uint32_t 是一种(可选)由 C 标准定义的类型。 uint32 只是你编的一个名字,虽然它恰好被定义为同一个东西。

【讨论】:

  • 这里有点死灵法,但是比较unsigned [int][unsigned] (short|long) [int] 可能会给新程序员一种错误的印象,即shortlong 在默认情况下是未签名的。我建议改为unsigned (short|long) [int]
【解决方案3】:

没有区别。

unsigned int = uint32 = uint32_t = unsigned 在你的情况下,unsigned int = unsigned 总是

【讨论】:

  • unsigned int == unsigned,但不保证uint32_t == unsigned intunsigned int 可以具有 16 位及以上的任何位宽。
  • 具有那些特定类型定义的环境中,uint32_t 的定义是unsigned int
  • @AndreyT:这就是我写“in your case”的原因
【解决方案4】:

unsignedunsigned int 之间绝对没有区别。

该类型是否与uint32_t 匹配是依赖于实现的; int 可能比 32 位“短”。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-18
    • 2018-03-08
    • 2022-01-07
    • 2019-01-08
    • 2014-06-24
    • 2013-11-17
    • 2012-12-09
    相关资源
    最近更新 更多