我是C的新手。我最近在C中遇到了这段代码:
#include <stdio.h>
int main()
{
unsigned Abc = 1;
signed Xyz = -1;
if(Abc<Xyz)
printf("Less");
else
if(Abc>Xyz)
printf("Great");
else
if(Abc==Xyz)
printf("Equal");
return 0;
}
我尝试运行它并输出“Less”。它是如何工作的? unsigned Abc是什么意思?我可以理解unsigned char Abc,但只是未签名的Abc?我很确定Abc不是数据类型!如何(和为什么?)这样做?
答案 0 :(得分:5)
发生了两件事。
int中C的默认数据类型。因此,您拥有signed int和unsigned int类型的变量。
在表达式中使用unsigned int和signed int时,在计算表达式之前,signed int将转换为unsigned。这将导致signed(-1)变成一个非常大的无符号数(由于2的补码表示)。
答案 1 :(得分:1)
C中的默认类型是int
。因此,unsigned
是unsigned int
的同义词。
Singed整数通常使用二进制补码处理。这意味着1的实际值是0x0001,-1的实际值是0xFFFF。
答案 2 :(得分:1)
据我所知,签名值会被提升为无符号值,因此变得非常大。
答案 3 :(得分:1)
int
是C中的“默认”类型。unsigned Abc
表示unsigned int Abc
就像long L
表示long int L
一样。
如果有一个混合有符号和无符号整数的表达式,则有符号整数会自动转换为无符号整数。大多数系统使用二进制补码来存储整数,因此(unsigned int)(-1)
等于最大可能unsigned int
。
答案 4 :(得分:1)
比较有符号和无符号类型会导致未定义的行为。您的程序可以并将在不同平台上打印不同的结果。
请参阅评论。
答案 5 :(得分:0)
unsigned / signed只是unsigned int / signed int(source)的简短规范,所以不,你没有“没有数据类型”的变量
答案 6 :(得分:0)
签名值将被提升为无符号值,因此它将大于1。
答案 7 :(得分:0)
签名Xyz = -1后添加以下行;
printf("is Abc => %x less than Xyz => %x\n",Abc,Xyz);
并亲自查看结果。