unsigned char i 是否等同于 unsigned j?

Is unsigned char i equivalent to unsigned j?

在下面的程序中我使用了 unsigned 关键字。

#include <stdio.h>

int main()
{
        unsigned char i = 'A';
        unsigned j = 'B';
        printf(" i = %c j = %c", i, j);
}

输出:

 i = A j = B

unsigned char i是否等同于unsigned j

不,unsigned junsigned int j 相同。

根据C11,章节 §6.7.2,类型说明符

unsigned, or unsigned int

所以,显然省略 int 仍然使变量为整数。

也就是说,为了消除任何混淆,规范列出了

  • unsigned char

...

  • unsigned, or unsigned int

作为两个不同的类型说明符,显然它们是不一样的。

Is unsigned char i equivalent to unsigned j?

否,当省略类型说明符并使用任何 signedunsignedshortlong 说明符时,int 是假设。

这意味着以下声明是等价的:

long a;
long int a;

unsigned short b;
unsigned short int b;

char 的符号问题是当省略 signedunsigned 时,符号取决于实现:

char x; // signedness depends on the implementation
unsigned char y; // definitely unsigned
signed char z; // definitely signed

不,它们不等同。 unsigned charunsigned是两种不同的类型(unsigned等同于unsigned int)。它们都是无符号整数类型,并且它们可以包含一些相同的值。

printf%c 格式说明符需要一个 int 类型的参数( 有符号 整数类型)。 unsigned char 参数被提升为 int,这样就可以了。 unsigned int 参数未转换为 int,但它恰好在这种情况下起作用(原因我不会深入)。

注意像'A'这样的字符常量也是int类型的。

答案是否定的

当你在以下情况下不指定类型时 signed unsigned long short 并且你默认分配数字它被视为 int.

字符的情况下

char a; // Depends on implementations.
signed char b; // Signed
unsigned char c; // Unsigned

取决于编译器和体系结构,但通常 unsigned int 的长度为 4 或 8 个字节,unsigned char 的长度通常为 1 个八位字节。

这意味着 unsigned 占 space 的 4 到 8 倍,并且可以容纳更大的数字(例如,unsigned 可以容纳数字 1,024,而典型的 unsigned char 最多只能容纳255).根据处理器的字节顺序,unsigned 的第一个八位字节可能与 unsigned char 版本相同(或不同)。

只要您不关心内存使用、溢出,或者不尝试用指针做奇怪的事情,它们就是一回事。但是当你开始用 C 做更时髦的事情时,它们很快就会开始不同。

unsignedintchar 是所谓的 类型说明符 。 C 中关于类型说明符的规则非常奇怪和不合理,有时是出于向后兼容的原因。

C 标准的第 6.7.2/2 章是这样的:

  • signed char 表示 signed char.
  • unsigned char 表示 unsigned char.
  • char 是与上述两种不同的类型,可以是有符号的也可以是无符号的。取决于编译器。
  • shortsigned shortshort intsigned short int 表示 short
  • unsigned shortunsigned short int 表示 unsigned short.
  • intsignedsigned int 表示 int
  • unsigned,或unsigned int表示unsigned int
  • longsigned longlong intsigned long int 表示 long

等等。如果你认为这个系统没有多大意义,那是因为它没有。

综上所述,我们可以看出 unsigned charunsigned 是不同的类型。

然而,对于所有可变参数函数(如 printf)有一个特殊情况规则(称为 "the default argument promotions"),表示所有小整数类型(如 char 都被隐式提升为类型int。这就是为什么您可以 printf("%d" 字符和整数。同样,%c 适用于整数,因为 printf 实际上不可能通过其参数获得真实的、非提升的字符类型。 int 或更小类型的任何内容在 printf 端将以 int 结束。