2016-04-21 160 views
1

我想知道在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'。 –

回答

8

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

相關問題