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

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


当前回答

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

其他回答

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

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

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

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

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

关键在于编写与实现无关的代码。Unsigned char不能保证是8位类型。Uint8_t是(如果可用)。

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

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

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

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