2017-04-15 49 views
1

我不明白爲什麼在這種情況下,程序正常工作:INT轉換爲char,無限執行

do { 
     i = f1.read(); // i is integer 
     j = f2.read(); // j is integer 
     if (Character.toLowerCase(i) != Character.toLowerCase(j)) break; 
    } while (i != -1 && j != -1); 

但在這種情況下,程序無限期執行:

do { 
     i =(char) f1.read(); 
     j =(char) f2.read(); 
     if (Character.toLowerCase(i) != Character.toLowerCase(j)) break; 
    } while (i != -1 && j != -1); 

我知道INT字符可以隱式轉換,但如果我明確地轉換它 - 它不起作用,爲什麼? 或者我明白了什麼錯誤?

+0

你在'while!循環中比較'i!= -1'。但''''是'char' ... –

+0

請提供一個[最小測試用例](http://stackoverflow.com/help/mcve)來演示這種行爲。 –

+0

還要注意,問題並非「無限執行」 - 這只是while循環的一個特性。這個問題(如果存在的話)僅僅是你看到'Character.toLowerCase'的行爲有所不同。 –

回答

3

一個char可以永遠不等於-1(它是一個無符號類型),所以當你輸入-1,並將其轉換爲char它變成正的,循環的結束條件永遠都無法滿足。

int i = -1; 

int i = (char) -1; 

相同的值不分配給i

0

每個整數變量所需的空間是4個字節併爲每個所需的空間僅是1個字節。由於每個這些空間都用2的補碼錶示,所以char變量不能在的空間中保留-1(因爲它是無符號的)並且它必須保持爲正值。因此,最好使用整數值保留代碼邏輯和條件。

+0

'char'是兩個字節,而不是一個。 –

+0

@JacobG。我相信這取決於字符編碼類型。我正在使用Java開發一些Android應用程序,我面臨這個問題。我使用UTF-8編碼,它是** 1字節**大。但我想你有充分的理由這樣說。 – aligholamee

+0

字符本身可以是一個字節大,但Java使用UTF-16作爲其默認編碼,因此使每個「字符」兩個字節。在默認情況下切換到UTF-8時,這將在JDK 9中更改。 –

2

作爲每甲骨文爪哇doc

炭:char數據類型是單16位的Unicode字符。它有 最小值'\ u0000'(或0)和最大值'\ uffff'(或 65,535)。

char永遠不能持有負值。
因此,條件while (i != -1 && j != -1)將始終爲真,循環將無限期地運行。


此外,當您嘗試分配negative valueschar,它會旋轉通過其他(最大)結束該值。

char c; 
c = (char) 65; // 'A' 
c = (char) -100; // 'ワ' and it results in 65,535(inclusive) - 100 = (char) 65,436 
c = (char) 65436; // 'ワ' 

int i; 
i = (char) 65; // 65 
i = (char) -1; // 65535 : notice how the char value cycles through the other end 
i = (char) -100; // 65436 : same as (char) -100. Here, int returns 65,436. 

替代方式來證明ij絕不會小於0和循環條件永遠是true