uint8_t和unsigned char之间的区别

时间:2018-11-13 13:38:06

标签: c

我正在使用mplabX 4.20和xc8编译器。我试图了解uint8_t和unsigned char之间的区别。它们的大小都在0到255之间。 两者都可以容纳字符和数字。但是哪种更好,在哪种情况下使用?

如果我想创建一个用于保存字符串的缓冲区的例子。

uint8_t buffer[20]="Hello World";
unsigned char buffer[20]="Hello World";

在大多数情况下,我需要保留字符。采取此操作的最佳做​​法是什么?

2 个答案:

答案 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_tuint8_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 == 8unsigned char之间没有区别。

  

我需要保留字符

然后使用普通的uint8_t

以字符串操作的函数通常具有[char const参数,您将无法将char *数组传递给它们。