在C中使用uint8_t优于unsigned char的优势是什么?

我知道在几乎每个系统uint8_t只是一个类型定义的unsigned char, 那么为什么要用它呢?


当前回答

只是为了卖弄学问,有些系统可能没有8位类型。根据维基百科:

实现需要为N = 8,16,32或64定义精确宽度的整数类型,当且仅当它具有满足要求的任何类型时。不需要为任何其他N定义它们,即使它支持适当的类型。

所以uint8_t并不保证存在,尽管它将为所有平台,其中8位= 1字节。一些嵌入式平台可能有所不同,但这种情况越来越少。一些系统可能将char类型定义为16位,在这种情况下可能不会有任何8位类型。

除了这个(小)问题,@Mark Ransom的答案在我看来是最好的。使用最清楚地显示你使用数据的目的的那个。

此外,我假设你的意思是uint8_t(标准类型定义从C99提供的stdint.h头)而不是uint_8(不是任何标准的一部分)。

其他回答

这一点非常重要,例如当你在编写网络分析器时。 数据包头是由协议规范定义的,而不是由特定平台的C编译器的工作方式定义的。

有小。从可移植性的角度来看,char不能小于8位,也不能小于char,所以如果给定的C实现有一个无符号8位整数类型,它将是char。或者,它可能根本没有类型定义,在这种情况下,任何类型定义技巧都是没有意义的。

它可以用来更好地记录您的代码,在某种意义上,很明显您需要8位字节,而不需要其他任何字节。但在实践中,几乎在任何地方这都是一个合理的期望(在DSP平台上,这是不正确的,但您的代码在那里运行的机会很小,并且您也可以在这样的平台上在程序顶部使用静态断言出错)。

它记录了你的意图——你将存储小数字,而不是一个字符。

此外,它看起来更好,如果你使用其他类型,如uint16_t或int32_t。

在几乎每个系统上,我都遇到了uint8_t == unsigned char,但这不是由C标准保证的。如果你试图编写可移植的代码,它的确切大小是什么内存,使用uint8_t。否则使用unsigned char。

就像你说的,“几乎每个系统”。

Char可能是一个不太可能改变的,但一旦你开始使用uint16_t和朋友,使用uint8_t混合更好,甚至可能成为编码标准的一部分。