我正在使用mplabX 4.20和xc8编译器。我试图了解uint8_t和unsigned char之间的区别。它们的大小都在0到255之间。 两者都可以容纳字符和数字。但是哪种更好,在哪种情况下使用?
如果我想创建一个用于保存字符串的缓冲区的例子。
uint8_t buffer[20]="Hello World";
unsigned char buffer[20]="Hello World";
在大多数情况下,我需要保留字符。采取此操作的最佳做法是什么?
答案 0 :(得分:2)
我正在使用mplabX 4.20和xc8编译器。我想了解 这是uint8_t和unsigned char之间的区别。两者的 它们的大小从0到255。两者都可以容纳字符和 数字。但是哪种更好,在哪种情况下使用?
unsigned char
是对应于signed char
的无符号整数类型。它的表示不使用任何填充位。它们都与类型char
占用相同的存储量,至少为 8位,但可能更多。宏CHAR_BIT
告诉您实现中包含多少个宏。每个符合标准的C实现都提供所有这些类型。
uint8_t
(如果有)是一种无符号整数数据类型,正好是8位宽且没有填充位。在将CHAR_BIT
定义为8的实现中,该类型与unsigned char
相同。在此类系统上,stdint.h
提供的声明在范围内的任何地方都可以互换使用两种类型。在其他系统上,根本不会声明uint8_t
。
如果我想创建一个用于保存字符串的缓冲区的例子。
如果要声明一个用于容纳字符串的缓冲区,那么就样式而言,应该使用char
类型,而不要使用其他两个类型:
char buffer[20] = "Hello World";
尽管其他两个或signed char
中的任何一个也可以用于字符串数据(在uint8_t
的情况下完全定义了类型),请键入char
是用于字符数据的常规工具。例如,见证就是这就是所有string.h
函数都被声明的类型。
您应仅在需要整数类型且其属性确切的地方使用uint8_t
:无符号,8个值位,无填充位。
您应该在需要最小的无符号整数类型的地方使用unsigned char
,但不要在意它是否正好是8位宽,或者要强调它与{的大小相同{1}}-可用的最小离散存储单元。
您应该使用char
来获得最小的有符号整数类型,但不要在意确切的大小或表示形式。
您应该使用signed char
,在这种情况下,您需要一个带正整数的类型,该正整数类型具有恰好7个值位,一个符号位和无填充位(以二进制补码表示)。
您应谨记,不能保证每个C实现都可以使用int8_t
和uint8_t
,并且在可用的情况下,使用它们需要包含int8_t
。此外,此标头和这些类型根本不是C90的一部分,因此,如果与旧版C实现的兼容性对您很重要,则不应使用它们。
答案 1 :(得分:1)
uint8_t与未签名字符之间的区别
如果您使用的是一种异国情调的系统,其中echo mb_strtolower('Fötus');
// Output is fötus
,则根本不会定义CHAR_BIT > 8
。
否则(如果为uint8_t
,则CHAR_BIT == 8
和unsigned char
之间没有区别。
我需要保留字符
然后使用普通的uint8_t
。
以字符串操作的函数通常具有[char
const
参数,您将无法将char *
数组传递给它们。