在以下程序中,我使用了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
?
答案 0 :(得分:24)
unsigned char i
是否等同于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
答案 1 :(得分: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
)都有一个特殊的大小写规则(称为&#34;默认参数promotion&#34;),表示所有小整数类型,例如char
都是隐式提升为int
类型。这就是为什么你可以printf("%d"
关于字符和整数的原因。类似地,%c
适用于整数,因为printf实际上不可能通过其参数获得真实的,非提升的字符类型。任何int
或更小类型的内容最终都会在printf的一侧显示为int
。
答案 2 :(得分:5)
不,他们不等同。 unsigned char
和unsigned
是两种不同的类型(unsigned
相当于unsigned int
)。它们都是无符号整数类型,并且它们可以将的某些保持为相同的值。
%c
的{{1}}格式说明符需要printf
类型的参数(这是签名的整数类型)。 int
参数被提升为unsigned char
,所以没关系。 int
参数未转换为unsigned int
,但在这种情况下恰好有效(原因我不会参与)。
请注意,int
等字符常量也属于'A'
类型。
答案 3 :(得分:3)
不,unsigned j
与unsigned int j
相同。
根据C11
,章节§6.7.2,类型说明符
unsigned
或unsigned int
因此,很明显省略int
仍然使变量成为整数。
那说,要清除任何混淆,规范列表
unsigned char
...
unsigned
或unsigned 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中做更有趣的事情时,它们会开始迅速变化。