2017-10-29 300 views
3
int main() { 
    char * a = (char*)malloc(1); 
    *a = 0xff; 
    std::cout << (*a == 0xff); 
    return 0; 
} 

爲什麼打印0而不是1?爲什麼在這種情況下打印錯誤?

+1

當你建立,你沒有從編譯器* *警告*?那麼也許你應該添加標誌來顯示更多的警告。問題很可能與'char'有關,可以是'signed'或'unsigned',在你的情況下最有可能是'signed'。 –

+0

沒有警告(Codeblocks) –

+0

轉到全局編譯器設置並添加警告選項(gcc:'-Wall -Wpedantic -Wextra')(搜索什麼適合您的編譯器)(並找出您使用哪個,codeblocks不是編譯器,但IDE)。它當然應該警告你有關已簽名/未簽名的比較(編輯:或常量溢出... hehe .. argh)。 gcc將發出:*「警告:隱式常量轉換中的溢出[-Woverflow]」*和-Wextra:*「警告:由於數據類型範圍有限,比較總是爲false [-Wtype-limits]」* – Ped7g

回答

6

0xff是一個積分常數,其類型爲int。要進行比較,*a必須升級到int

看起來char已在您的平臺上簽名。所以當推廣到一個整數時,將會有符號擴展。

假設32位int,您在比較0xffffffff0x000000ff

切換到unsigned char會給你想要的結果可靠。

+0

你非常好的解釋! –

+0

@JaroslavTavgen - 樂於助人。順便說一句,你應該檢查你的編譯器開關。 [大多數**會警告你**](http://coliru.stacked-crooked.com/a/259265e9c0bc7de2)。 – StoryTeller

+0

再次謝謝你!我在編譯器中打開了警告,現在編譯代碼時顯示2個警告:「warning:溢出隱式常量轉換[-Woverflow]」和「警告:由於數據類型範圍有限,比較始終爲false [ - Wtype-limits]「 –

0

十六進制中的0xff是十進制的255。 char關鍵字表示有符號字符,範圍從-128到127(含) 255不能存儲在字符中並溢出。無論結果如何,它都不是0xff。

因此,它打印False。

希望有幫助! :)

+0

'char'可以是有符號的或無符號的 –

相關問題