uint
和有什么区别unsigned int
吗?
我正在查看此站点,但所有问题均涉及 C# 或 C++。我想要一个关于 C 语言的答案。
如果相关,请注意我在 Linux 下使用 GCC。
uint
不是标准类型 -unsigned int
是。
一些系统可能将 uint 定义为 typedef。
typedef 无符号 int uint;
对于这些系统,它们是相同的。但是 uint 不是标准类型,所以每个系统可能都不支持它,因此它是不可移植的。
我正在扩展 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
这里的所有答案都没有提到uint
.
它显然是 a typedef
of unsigned int
,但这并不能解释它的用处。
真正的问题是,
为什么有人想将基本类型定义为缩写版本?
为了节省打字?
不,他们这样做是出于必要。
考虑 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 };
这unsigned int
是一个内置(标准)类型,因此如果您希望您的项目是跨平台的,请始终使用它,unsigned int
因为它保证所有编译器都支持(因此是标准)。
Theuint
是 . 的可能且正确的缩写unsigned int
。它的可读性更好。但是:它不是 C 标准。您可以根据自己的职责定义和使用它(与所有其他定义一样)。但不幸的是,一些系统头文件也定义uint
了。我sys/types.h
从当前的编译器(ARM)中找到:
# 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。