【问题标题】:Difference between uint and unsigned int?uint和unsigned int的区别?
【发布时间】:2011-08-06 09:20:58
【问题描述】:

uintunsigned int 有什么区别吗?

我正在查看此站点,但所有问题均涉及 C# 或 C++。 我想要一个关于 C 语言的答案。

如果相关,请注意我在 Linux 下使用 GCC。

【问题讨论】:

  • 它们是相同的uint只是types.h中定义的typedef
  • typedef unsigned int uint; /* Sys V compatibility */

标签: c gcc uint


【解决方案1】:

uint 不是标准类型 - unsigned int 是。

【讨论】:

  • 这个事实意味着什么?
  • @the_candyman:你的 gcc 可能碰巧有 uint - 或者它可能碰巧没有。它unsigned int
  • uint 编写的代码本质上是不可移植的,除非uint 是您在该代码中实际声明的typedef
  • 一个更好的说法是uint不是C语言的一部分,而是一些懒人定义的typedef。 :-)
  • @Jack 在这种情况下,如果您的编译器已经为您提供了 -Wshadow 错误,您可能会收到它......就像 gcc 一样。 . .
【解决方案2】:

某些系统可能将 uint 定义为 typedef。

typedef unsigned int uint;

对于这些系统,它们是相同的。但是 uint 不是标准类型,所以每个系统可能都不支持它,因此它是不可移植的。

【讨论】:

  • 值得注意的是,如果你真的想要一个特定大小的无符号整数,那么使用uintXX_t
  • @Blagovest: uintXX_t 类型只有在有意义的情况下才会在特定的 C99 实现中定义。 uint_leastXX_t 在所有 C99 实现中都有定义。而且,这些类型在以前的标准版本中不存在(并非所有当前的 C 编译器都是 C99 编译器)。
【解决方案3】:

unsigned int 是一种内置(标准)类型,因此如果您希望您的项目是跨平台的,请始终使用 unsigned int,因为它保证所有编译器都支持(因此是 标准)。

【讨论】:

    【解决方案4】:

    我正在扩展 Erik、Teoman Soygul 和 taskinoor 的一些答案

    uint 不是标准。

    因此不鼓励像这样使用自己的速记:

    typedef unsigned int uint;

    如果您改为寻找平台特异性(例如,您需要指定 int 占用的位数),包括stdint.h

    #include <stdint.h>
    

    将公开以下标准整数类别:

    • 具有特定精确宽度的整数类型

    • 具有至少某些指定宽度的整数类型

    • 具有至少某些指定宽度的最快整数类型

    • 整数类型的宽度足以容纳指向对象的指针

    • 具有最大宽度的整数类型

    例如,

    精确宽度整数类型

    typedef 名称 int N _t 指定有符号整数类型,宽度 N、无填充位和二进制补码表示。因此, int8_t 表示有符号整数类型,宽度正好为 8 位。

    typedef 名称 uint N _t 指定一个无符号整数类型 宽度 N。因此,uint24_t 表示一个无符号整数类型,宽度为 正好是 24 位。

    定义

    int8_t
    int16_t
    int32_t
    uint8_t
    uint16_t
    uint32_t
    

    【讨论】:

      【解决方案5】:

      这里的所有答案都没有提到uint的真正原因。
      这显然是unsigned int 中的typedef,但这并不能解释它的用处。

      真正的问题是,

      为什么有人想将基本类型定义为缩写 版本?

      为了节省打字时间?
      不,他们这样做是出于必要。

      考虑C语言;一种没有模板的语言。
      您将如何消除可以容纳任何类型的自己的向量?

      你可以用 void 指针做一些事情,
      但是更紧密地模拟模板会让您求助于宏。

      所以你要定义你的模板向量:

      #define define_vector(type) \
        typedef struct vector_##type { \
          impl \
        };
      

      声明你的类型:

      define_vector(int)
      define_vector(float)
      define_vector(unsigned int)
      

      在生成时,意识到类型应该是一个单一的标记:

      typedef struct vector_int { impl };
      typedef struct vector_float { impl };
      typedef struct vector_unsigned int { impl };
      

      【讨论】:

      • 这是一个可能的原因,但你能举个例子说明那是真正的原因吗?
      【解决方案6】:

      uintunsigned int 的可能且正确的缩写。它的可读性更好。但是:它不是 C 标准。您可以根据自己的职责定义和使用它(与所有其他定义一样)。 但不幸的是,一些系统头文件也定义了uint。我在当前编译器 (ARM) 的 sys/types.h 中找到:

       # ifndef   _POSIX_SOURCE
        //....
       typedef    unsigned short  ushort;     /* System V compatibility */
       typedef    unsigned int    uint;       /* System V compatibility */
       typedef    unsigned long   ulong;      /* System V compatibility */
       # endif    /*!_POSIX_SOURCE */
      

      这似乎是对编程为 Unix System V 标准的熟悉源代码的让步。关闭这种不良行为(因为我想

      #define uint unsigned int 
      

      我自己先设置了

      #define _POSIX_SOURCE
      

      系统的标题不能定义不标准的东西。但不幸的是,那里定义了很多东西。

      另请参阅我的网页https://www.vishia.org/emc/html/Base/int_pack_endian.html#truean-uint-problem-admissibleness-of-system-definitions resp。 https://www.vishia.org/emc.

      【讨论】:

        猜你喜欢
        • 2017-09-10
        • 2011-12-12
        • 1970-01-01
        • 2017-06-20
        • 1970-01-01
        • 2012-02-21
        • 1970-01-01
        • 2013-11-12
        • 2011-04-13
        相关资源
        最近更新 更多