将无符号字符与一个负数进行比较
我想知道在ar [i]!= -1的第9行会发生什么。结果是循环不停止,但我不知道为什么。将无符号字符与一个负数进行比较
4 int main()
5 {
6 unsigned char ar[] = {1, 2, 3, 4, 5, -1};
7 int i;
8
9 for (i = 0; ar[i] != -1; i++)
10 {
11 printf("ar: %u\n", ar[i]);
12 }
13 printf("out: %u\n", ar[i]);
14
15 return 0;
16
17 }
感谢,
unsigned char ar[] = {1, 2, 3, 4, 5, -1};
初始化ar[5]
到(unsigned char)-1
,这是因为255
无符号运算就封装。
然后你做ar[5] != -1
。 整数促销从unsigned char
左侧从int
而不更改值。这使得比较255 != -1
,这是真实的,所以循环继续。
一个解决方案是环路条件测试(unsigned char)-1
。或者,您可以使用数组维度而不是标记值。
然后会发生什么?当比较一个char和一个整数时,(0xff!= 0xffffffff),编译器做了什么?它如何比较它?人们也可以猜测编译器会将0xff填充为'f',然后比较将是0xffffffff!= 0xffffffff,这是错误的(它们相等) – nerez
没有涉及'0xffffffff'。有ints'255'和'-1'。这些是不同的'int'值。 C算法根据值进行工作。在内存中的表示并不重要 –
@nerez给出一个很好的理由,为什么编译器应该这样强制执行'0xff'->'0xffffffff'?首先用'gdb'或简单的例子来检查,例如:'char ch ='A'; int a = ch; printf(“%x”,a)'然后写这样的注释 – red0ct
“UCHAR_MAX”和“INT_MAX”的值是什么? – EOF
如果您使用GCC并已启用警告,它应该警告您有关签名和无符号比较。无论如何,无符号数字不能存储负数。 –
'unsigned char'是无符号的,因此永远不等于'-1'。 –