2013-12-19 87 views
2

我正在學習ASCII以及它如何編碼字符。據我的理解(雖然我可能是錯誤的,因爲我還在學習),它是ASCII將數字編碼爲字符。例如,這樣的事情:將ASCII數字轉換爲實際字符

0011 0000 = 30 = '0'(這是一個編碼字符)

0000 0000 = 0 = 0(雖然這是一個實際的數)

表示兩種不同類型的零編碼。

問題

有什麼辦法來顯示一個ASCII字符數據類型真實的數字?

我嘗試下面的代碼:

#include <iostream> 

int main(void) { 

    char e = '0'; 

    std::cout << e << std::endl; 
    std::cout << sizeof(e) << std::endl; 

    std::cin.get(); 
    std::cin.get(); 

return 0; 
} 

我知道這個代碼不接近的結果,我想完成;然而,這是我所能想到的。我需要更好地瞭解如何通過C++語法完成此轉換

此外,請原諒我的任何誤導信息或標題。我仍然在學習編程的「繩索」。

+0

「ASCII將數字編碼爲字符」 - 這是相反的方式...... ASCII將字符編碼爲數字。 (你不會把數字編碼成ASCII碼,因爲一般情況下你會得到亂碼文本,其中混入了控制字符,這對任何人都沒有用處,但是我們必須對文本進行一些編碼才能在計算機中傳遞它。 )你太親近了! –

+1

所有字符編碼,其中有許多不僅僅是ASCII,而是使用數字來表示字符。 –

回答

5

演員的charint

std::cout << static_cast<int>(e); 

char其實已經是一個整數,它只是的operator<<過載走char顯示它作爲一個字符。通過使用轉換將類型更改爲int,我們導致要調用的運算符的不同重載,其中一個被寫爲以整數形式顯示。

+0

非常好的解釋,但這樣做會導致Char變量'e'變成程序其餘部分的int數據類型嗎? – Jake2k13

+3

@ Jake2k13:否。此操作對'e'變量沒有影響。它創建一個具有相同值的新的,臨時的,未命名的'int'變量。 –

2

像這樣的事情

#include <iostream> 

int main(void) { 

    char e = '0'; 

    std::cout << e - '\0' << std::endl; 
    std::cout << sizeof(e) << std::endl; 

    std::cin.get(); 
    std::cin.get(); 

    return 0; 
} 

char e等於任何字符嘗試它,它會打印字符的實際值。感謝chris提出了另一種做法;這是通過將角色投射到int

std::cout << static_cast<int>(e) << std::endl; 
+0

我寧願看到一個演員,而不是減去零tbh。 – chris

+0

@chris,在這種情況下是不是「零」字符「空字符」? – Jake2k13

+1

是的,但在我看來,它不如'static_cast (e)'清晰。如果時間越短越好,那麼我們最終會得到APL或Perl或其他地方的東西。 – chris

4

根據我的理解,您希望存儲在內存中的實際值爲'0'= 0x30 = 48。在內存中char數據類型也以整數形式存儲,但以8位格式存儲。因爲這個,如果你使用int類型轉換變量,那麼你將得到整數格式的存儲值而不是Ascii字符。

#include <iostream> 

int main(void) { 

    char e = '0'; 

    std::cout << (int)e << std::endl; 
    std::cout << sizeof(e) << std::endl; 

    std::cin.get(); 
    std::cin.get(); 

return 0; 
} 
+0

+1。僅僅通過對OP和其他讀者的進一步解釋,'static_cast (e)'是一種新的C++唯一的方式來請求轉換,如果「e」對於這種情況不是一種明智的類型,將會產生編譯器錯誤轉換,而從C語言繼承'(int)e',做同樣的事情,很簡潔但不太安全。 –