将无符号字符与一个负数进行比较

问题描述:

我想知道在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 } 

感谢,

+0

“UCHAR_MAX”和“INT_MAX”的值是什么? – EOF

+2

如果您使用GCC并已启用警告,它应该警告您有关签名和无符号比较。无论如何,无符号数字不能存储负数。 –

+2

'unsigned char'是无符号的,因此永远不等于'-1'。 –

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。或者,您可以使用数组维度而不是标记值。

+0

然后会发生什么?当比较一个char和一个整数时,(0xff!= 0xffffffff),编译器做了什么?它如何比较它?人们也可以猜测编译器会将0xff填充为'f',然后比较将是0xffffffff!= 0xffffffff,这是错误的(它们相等) – nerez

+4

没有涉及'0xffffffff'。有ints'255'和'-1'。这些是不同的'int'值。 C算法根据值进行工作。在内存中的表示并不重要 –

+1

@nerez给出一个很好的理由,为什么编译器应该这样强制执行'0xff'->'0xffffffff'?首先用'gdb'或简单的例子来检查,例如:'char ch ='A'; int a = ch; printf(“%x”,a)'然后写这样的注释 – red0ct