uint和unsigned int有什么区别?

66

uintunsigned int之间有什么区别吗?

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

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


2
它们是相同的,uint只是在types.h中定义的一个typedef。 - anilbey
3
typedef unsigned int uint; /* Sys V兼容性 */ - anilbey
6个回答

87

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


23
这个事实意味着什么? - the_candyman
18
你的gcc可能具有uint,也可能没有。它一定会有unsigned int - Erik
15
除非 uint 是在代码内声明的 typedef,否则使用 uint 编写的代码本质上不具备可移植性。 - Jack
4
更好的表达应该是,uint 并不是 C 语言的一部分,而是一些懒惰的人定义的 typedef。 :-) - R.. GitHub STOP HELPING ICE
在任何编译器中,本地定义typedef unsigned int uint是完全安全的吗? - Antonio
显示剩余3条评论

43

有些系统可能会将 uint 定义为一种 typedef。

typedef unsigned int uint;

对于这些系统来说,它们是相同的。但是 uint 不是标准类型,因此并不是每个系统都支持它,因此它不具备可移植性。


2
值得注意的是,如果您真的想要一个特定大小的无符号整数,则使用 uintXX_t - Blagovest Buyukliev
3
如果有意义,uintXX_t 类型仅在特定的 C99 实现中定义。 uint_leastXX_t 在所有 C99 实现中都定义。这些类型在标准的早期版本中并不存在(不是所有当前的 C 编译器都是 C99 编译器)。 - pmg

20

我稍微扩展了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

11

所有这里的回答都未提到uint的真正原因。
很明显,它是unsigned inttypedef,但这并不能解释其有用性。

真正的问题是,

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

为了节省键入时间吗?
不,他们出于必要而这样做。

考虑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 };

2
这是一个可能的原因,但你能举出一个实际发生该原因的例子吗? - Keith Thompson

8

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


2

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-definitionshttps://www.vishia.org/emc

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接