C 为什么1>-1似乎是假的?
我已经编写了以下代码,但问题是它没有显示所需的输出C 为什么1>-1似乎是假的?,c,char,int,C,Char,Int,我已经编写了以下代码,但问题是它没有显示所需的输出 #include<stdio.h> int main() { unsigned x=1; signed char y=-1; if(x>y) printf("x>y\n"); else printf("x<=y\n"); return 0; } #包括 int main() { 无符号x=1; 符号字符y=-1; 如果(x>y) print
#include<stdio.h>
int main()
{
unsigned x=1;
signed char y=-1;
if(x>y)
printf("x>y\n");
else
printf("x<=y\n");
return 0;
}
#包括
int main()
{
无符号x=1;
符号字符y=-1;
如果(x>y)
printf(“x>y\n”);
其他的
printf(“x无符号x=1;
=无符号整数x=1;
)
和x=0x00000001;
y=0xff
当比较x
和y
时,会出现类型转换
,因为两者的类型不同
y
将首先转换为int
,值为0xFFFFFF
,但两者的类型仍然不同,因此y
的类型将转换为无符号int
,值为0xFFFFFF
现在,比较两个无符号int
,值是:x=0x00000001
,y=0xffffff
。现在,您应该了解原因了。无符号x=1;
=无符号int x=1;
和x=0x00000001;
y=0xff
当比较x
和y
时,会出现类型转换
,因为两者的类型不同
y
将首先转换为int
,值为0xFFFFFF
,但两者的类型仍然不同,因此y
的类型将转换为无符号int
,值为0xFFFFFF
现在,比较两个
无符号int
,值是:x=0x00000001
,y=0xFFFFFF
。现在,您应该了解原因了。由于从有符号字符到无符号int的类型转换,程序给出了错误的输出。
尽量避免字符到整数的隐式类型转换。由于从有符号字符到无符号整数的类型转换,程序给出了错误的输出。
尽量避免将字符转换为int隐式类型转换。有符号字符操作数
y
转换为无符号操作数y
,产生一个大的正值。如果有符号字符y转换为无符号,则它应该是y=1,然后是x==y,但当我使用条件if(x>=y)时if条件不是真的。不,将-1
转换为无符号的结果是UINT_MAX
,而不是1
。现在,知道了。是的,在转换无符号字符后,它是一个巨大的数字10位。这就是if条件变为假的原因。@luiscolrado(无符号)-1
不是未定义的行为。从有符号到无符号的转换和赋值是明确定义的。有符号字符
操作数y
被转换为无符号
,产生一个大的正值。如果有符号字符y被转换为无符号,那么它应该是y=1,然后是x==y,但当我使用条件if(x>=y)if条件不是真的。不,将-1
转换为无符号的结果是UINT_MAX
,而不是1
。现在,知道了。是的,在转换无符号字符后,它是一个巨大的数字10位。这就是if条件变为假的原因。@luiscolrado(无符号)-1
不是未定义的行为。从有符号到无符号的转换和赋值是定义良好的。-1不能转换为无符号,但编译器允许,会产生未定义的行为…这是错误的常见原因。最好考虑将负数转换为无符号作为未定义行为的后果,而不是assum毫无疑问,-1只是与0xFFFFFF进行比较(64位整数或短整数会发生什么情况?)。在非2的补码算术体系结构中会发生什么情况?y=0xFF
不是一种很好的写东西的方法。y
是-1
。内存中的表示可能是所有位的集合,但是(a)这与问题无关,以及(b)当你写0xFF
时,你会混淆你所说的是内存中的表示,还是C整数文字。@MattMcNabb如果你想要一个无符号的整数,就写~0
,但不要用-
符号来表示无符号整数。0xFF
不是一个好值的原因是依赖性对于体系结构中的字长。好的,有一些方法可以循环,而不必依赖于体系结构,但使用符号不是其中之一。-1不能转换为无符号,但编译器允许,产生未定义的行为…这是错误的常见原因。最好考虑转换负数的后果将数字改为无符号是未定义的行为,而不是毫无意义地假设-1仅与0xFFFFFF进行比较(64位整数或短整数会发生什么情况?)在非二的补码算术体系结构中会发生什么?y=0xFF
不是一种好的写东西的方法。y
是-1
。内存中的表示可能是所有位集,但是(a)与问题无关,以及(b)当你写0xFF
时,你会混淆你所说的是内存中的表示,还是C整数文字。@MattMcNabb如果你想要一个无符号的整数,就写~0
,但不要用-
符号来表示无符号整数。0xFF
不是一个好值的原因是依赖性架构中的单词长度。好的,有一些方法可以循环使用,而不必依赖于架构,但使用符号不是其中之一。