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 j
与 unsigned 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
?
否,当省略类型说明符并使用任何 signed
、unsigned
、short
或 long
说明符时,int
是假设。
这意味着以下声明是等价的:
long a;
long int a;
unsigned short b;
unsigned short int b;
char
的符号问题是当省略 signed
或 unsigned
时,符号取决于实现:
char x; // signedness depends on the implementation
unsigned char y; // definitely unsigned
signed char z; // definitely signed
不,它们不等同。 unsigned char
和unsigned
是两种不同的类型(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 做更时髦的事情时,它们很快就会开始不同。
unsigned
、int
和 char
是所谓的 类型说明符 。 C 中关于类型说明符的规则非常奇怪和不合理,有时是出于向后兼容的原因。
C 标准的第 6.7.2/2 章是这样的:
signed char
表示 signed char
.
unsigned char
表示 unsigned char
.
char
是与上述两种不同的类型,可以是有符号的也可以是无符号的。取决于编译器。
short
、signed short
、short int
或 signed short int
表示 short
。
unsigned short
或 unsigned short int
表示 unsigned short
.
int
、signed
或 signed int
表示 int
。
unsigned
,或unsigned int
表示unsigned int
。
long
、signed long
、long int
或 signed long int
表示 long
。
等等。如果你认为这个系统没有多大意义,那是因为它没有。
综上所述,我们可以看出 unsigned char
和 unsigned
是不同的类型。
然而,对于所有可变参数函数(如 printf
)有一个特殊情况规则(称为 "the default argument promotions"),表示所有小整数类型(如 char
都被隐式提升为类型int
。这就是为什么您可以 printf("%d"
字符和整数。同样,%c
适用于整数,因为 printf 实际上不可能通过其参数获得真实的、非提升的字符类型。 int
或更小类型的任何内容在 printf 端将以 int
结束。
在下面的程序中我使用了 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 j
与 unsigned int j
相同。
根据C11
,章节 §6.7.2,类型说明符
unsigned
, orunsigned int
所以,显然省略 int
仍然使变量为整数。
也就是说,为了消除任何混淆,规范列出了
unsigned char
...
unsigned
, orunsigned int
作为两个不同的类型说明符,显然它们是不一样的。
Is
unsigned char i
equivalent tounsigned j
?
否,当省略类型说明符并使用任何 signed
、unsigned
、short
或 long
说明符时,int
是假设。
这意味着以下声明是等价的:
long a;
long int a;
unsigned short b;
unsigned short int b;
char
的符号问题是当省略 signed
或 unsigned
时,符号取决于实现:
char x; // signedness depends on the implementation
unsigned char y; // definitely unsigned
signed char z; // definitely signed
不,它们不等同。 unsigned char
和unsigned
是两种不同的类型(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 做更时髦的事情时,它们很快就会开始不同。
unsigned
、int
和 char
是所谓的 类型说明符 。 C 中关于类型说明符的规则非常奇怪和不合理,有时是出于向后兼容的原因。
C 标准的第 6.7.2/2 章是这样的:
signed char
表示signed char
.unsigned char
表示unsigned char
.char
是与上述两种不同的类型,可以是有符号的也可以是无符号的。取决于编译器。short
、signed short
、short int
或signed short int
表示short
。unsigned short
或unsigned short int
表示unsigned short
.int
、signed
或signed int
表示int
。unsigned
,或unsigned int
表示unsigned int
。long
、signed long
、long int
或signed long int
表示long
。
等等。如果你认为这个系统没有多大意义,那是因为它没有。
综上所述,我们可以看出 unsigned char
和 unsigned
是不同的类型。
然而,对于所有可变参数函数(如 printf
)有一个特殊情况规则(称为 "the default argument promotions"),表示所有小整数类型(如 char
都被隐式提升为类型int
。这就是为什么您可以 printf("%d"
字符和整数。同样,%c
适用于整数,因为 printf 实际上不可能通过其参数获得真实的、非提升的字符类型。 int
或更小类型的任何内容在 printf 端将以 int
结束。