unsigned char i是否等同于unsigned j?

时间:2016-09-06 05:55:11

标签: c types unsigned

在以下程序中,我使用了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

6 个答案:

答案 0 :(得分:24)

  

unsigned char i是否等同于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

答案 1 :(得分:10)

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
  • unsignedunsigned int表示unsigned int
  • longsigned longlong intsigned long int表示long

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

鉴于上述情况,我们可以判断unsigned charunsigned是不同的类型。

然而,所有变量参数函数(如printf)都有一个特殊的大小写规则(称为&#34;默认参数promotion&#34;),表示所有小整数类型,例如char都是隐式提升为int类型。这就是为什么你可以printf("%d"关于字符和整数的原因。类似地,%c适用于整数,因为printf实际上不可能通过其参数获得真实的,非提升的字符类型。任何int或更小类型的内容最终都会在printf的一侧显示为int

答案 2 :(得分:5)

不,他们不等同。 unsigned charunsigned是两种不同的类型(unsigned相当于unsigned int)。它们都是无符号整数类型,并且它们可以将的某些保持为相同的值。

%c的{​​{1}}格式说明符需要printf类型的参数(这是签名的整数类型)。 int参数被提升为unsigned char,所以没关系。 int参数未转换为unsigned int,但在这种情况下恰好有效(原因我不会参与)。

请注意,int等字符常量也属于'A'类型。

答案 3 :(得分:3)

不,unsigned junsigned int j相同。

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

  

unsignedunsigned int

因此,很明显省略int仍然使变量成为整数。

那说,要清除任何混淆,规范列表

  
      
  • unsigned char
  •   
     

...

     
      
  • unsignedunsigned int
  •   

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

答案 4 :(得分:2)

答案是否。

如果您未在以下情况function split_file(filename_in) data = csvread(filename_in); data_size = size(data); tenthofdata = round(data_size(1)/10); for i = 1:9 %first nine csvwrite([filename_in num2str(i+1)],data(1:tenthofdata)); data = data(tenthofdata+1:end); end csvwrite([filename_in '10'],data); %remainder end signed unsigned long中指定类型,并且您默认指定号码,则将其视为short

如果是字符

int

答案 5 :(得分:0)

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

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

只要你不关心内存使用,溢出,或者不想用指针做奇怪的事情,它们就是一样的。但是当你开始在C中做更有趣的事情时,它们会开始迅速变化。