我知道在几乎所有的系统中,`uint8_t`只是`unsigned char`的一个typedef,那么为什么要使用它呢?
它记录了你的意图 - 你将要存储小数值,而不是字符。
如果你使用其他typedefs,例如uint16_t
或int32_t
,也会更好看。
仅仅是挑剔一下,有些系统可能没有8位类型。根据维基百科:
如果实现符合要求,则需要为N = 8、16、32或64定义精确宽度整数类型;如果存在任何满足要求的类型,则不需要为任何其他N定义它们,即使它支持适当的类型也不需要。
因此,不能保证存在uint8_t
,尽管在所有8位=1字节的平台上都会存在。某些嵌入式平台可能会有所不同,但这已经非常罕见了。某些系统可能将char
类型定义为16位,在这种情况下,可能不会有任何8位类型。
除了这个(小)问题外,我认为@Mark Ransom的回答是最好的。使用最能清楚地显示您正在使用数据的方法。
另外,我假设您指的是uint8_t
(C99中提供的标准typedef,位于stdint.h
标头),而不是uint_8
(不属于任何标准)。
uint8_t
(或将其typedef为该类型)。这是因为8位类型在存储表示中会有未使用的位,而uint8_t
不能有这种情况。 - Steve Jessop `typedef unsigned integer type uint8_t; // optional`
因此,本质上,符合C++标准的库根本不需要定义uint8_t(请参见注释//optional)。 - nightlytrailsuint_least8_t
来正确表示意图和事实,即该类型实际上可能不是8位。 - Toby写代码的整个目的就是编写与实现无关的代码。unsigned char
不保证是8位类型。uint8_t
是(如果可用)。
sizeof(unsigned char)
将返回1字节大小。但如果系统中的字符和整数大小相同,例如16位,则sizeof(int)
也将返回1。 - Toby正如您所说,"几乎每个系统"。
char
可能是最不可能更改的类型之一,但一旦开始使用uint16_t
及其相关类型,则使用uint8_t
可以更好地融合,并且甚至可能成为编码标准的一部分。
#pragma pack(1)
typedef struct {
uint8_t flag1:1;
uint8_t flag2:1;
padding1 reserved:6; /* not necessary but makes this struct more readable */
uint32_t sequence_no;
uint8_t data[8];
uint32_t crc32;
} s_mypacket __attribute__((packed));
#pragma pack()
gcc的__attribute__((packed)) / #pragma pack是否安全?
http://solidsmoke.blogspot.ca/2010/07/woes-of-structure-packing-pragma-pack.html
很少有例外。从可移植性的角度来看,char
不能小于8位,而且没有比 char
更小的类型,因此如果给定的 C 实现具有无符号8位整数类型,则它将是 char
。或者可能根本没有这种类型,此时任何 typedef
技巧都没有用。
使用它可以更好地记录代码,因为它清楚地表明您在那里需要8位字节,而不需要其他任何东西。但实际上,在几乎任何情况下,这已经是一个合理的期望(有一些 DSP 平台上并非如此,但您的代码在那里运行的机会很小,您可以在程序顶部使用静态断言报告错误)。
uint8_t
添加到实现中。我想知道,对于具有16位字符的DSP的编译器通常是否会实现 uint8_t
。 - Steve Jessop#include <stdint.h>
,然后使用uint8_t
。如果平台有它,它会给你。如果平台没有它,你的程序将无法编译,并且原因将是清晰明了的。 - Pavel Minaev在编写网络分析器时,这非常重要。数据包头由协议规范定义,而不是特定平台的C编译器工作方式决定。
在我遇到的几乎所有系统中,uint8_t == unsigned char,但这并不被C标准保证。如果您正在编写可移植的代码,并且内存大小很重要,请使用uint8_t。否则请使用unsigned char。
uint8_t
一直匹配unsigned char
的范围和大小,当unsigned char
是8位时没有填充。当unsigned char
不是8位时,uint8_t
不存在。 - chux - Reinstate Monicaunsigned char
是8位,那么uint8_t
是否保证是其typedef
,而不是扩展无符号整数类型的typedef
? - hsivonenunsigned char/signed char/char
是最小的类型 - 不小于8位。 unsigned char
没有填充。对于uint8_t
而言,它必须是8位,没有填充,并存在于实现提供的整数类型中:与unsigned char
的最小要求相匹配。至于“...保证是typedef...” 看起来是一个好问题要发布。 - chux - Reinstate Monica
unsigned char
或signed char
也可以记录意图,因为未修饰的char
表明您正在处理字符。 - cafunsigned
就是指unsigned int
吗? - Mark Ransomchar
似乎暗示一个字符,而在UTF8字符串的上下文中,它可能只是多字节字符的一个字节。使用uint8_t可以清楚地表明,在每个位置都不应该期望一个字符——换句话说,字符串/数组的每个元素都是一个任意的整数,不能对其进行语义假设。当然,所有C程序员都知道这一点,但这可能会促使初学者提出正确的问题。 - tne