在以下程序中我使用了unsigned关键字.
#include <stdio.h>
int main()
{
unsigned char i = 'A';
unsigned j = 'B';
printf(" i = %c j = %c", i, j);
}
Run Code Online (Sandbox Code Playgroud)
输出:
i = A j = B
Run Code Online (Sandbox Code Playgroud)
是unsigned char i 相当于unsigned j?
Bla*_*iev 24
是
unsigned char i相当于unsigned j?
不,在省略类型说明符和任何的signed,unsigned,short或long说明符的使用,int假定.
这意味着以下声明是等效的:
long a;
long int a;
unsigned short b;
unsigned short int b;
Run Code Online (Sandbox Code Playgroud)
签名的问题char是,当signed或被unsigned省略时,签名取决于实现:
char x; // signedness depends on the implementation
unsigned char y; // definitely unsigned
signed char z; // definitely signed
Run Code Online (Sandbox Code Playgroud)
Lun*_*din 10
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所有小整数类型char都被隐式提升为类型int.这就是为什么你可以printf("%d"在字符和整数上.同样,%c适用于整数,因为printf实际上不可能通过其参数获得真实的,非提升的字符类型.任何类型int或更小的东西都会像intprintf 那样结束.
不,他们不相同. unsigned char并且unsigned是两种不同的类型(unsigned相当于unsigned int).它们都是无符号整数类型,并且它们可以包含一些相同的值.
期望参数类型的%c格式说明符(有符号整数类型).一个参数被提升为,所以没关系.一种说法是没有转换为,但它发生在这种情况下工作(的原因,我不会进入).printfintunsigned charintunsigned intint
请注意,字符常量'A'也是类型int.