unsigned char i是否等同于unsigned j?

msc*_*msc 11 c unsigned types

在以下程序中我使用了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,shortlong说明符的使用,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)

  • @TimF:我不同意.简单的`unsigned`不是模糊的或任何东西 - 它是`unsigned int`,每个C程序员都应该知道它,它不是一些深奥的黑暗语言角落.最重要的是,`unsigned`足够长,可以自行输入,即使没有添加`int`的冗余. (5认同)
  • `signed`,`unsigned`,`short`,`long`和`int`是*all*type specifiers.有关类型说明符的各种组合的含义的解释,请参见[N1570](http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf)第6.7.2节.@TimF,`unsigned`和`unsigned int`一样具体(尽管如果你发现它更清楚,写`unsigned int`并没有什么坏处). (4认同)
  • @TimF:开发人员可以在第一次遇到它时查看这些内容,然后记住它,而不是抱怨其他人不应该写任何你不知道的东西;-p (2认同)

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 那样结束.

  • `char`是`signed char`和`unsigned char`的独立类型 (2认同)
  • 重要的是`char`并不意味着`signed char`或`unsigned char`.它们是三种不同的类型.你的第三点与你的其他帖子不一致; 例如`signed short`和`short`实际上是两种不同的写同类型的方式,但你写了"手段"来表达这两种情况. (2认同)

Kei*_*son 5

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

期望参数类型的%c格式说明符(有符号整数类型).一个参数被提升为,所以没关系.一种说法是没有转换为,但它发生在这种情况下工作(的原因,我不会进入).printfintunsigned charintunsigned intint

请注意,字符常量'A'也是类型int.

  • @Lundin:不,`%c`需要一个类型为`int`的参数,并将该值转换为`unsigned char`.N1570 7.21.6.1p8. (5认同)