2016-10-03 101 views
0
#include <stdio.h> 

int main() 
{ 
    char c = 255; 
    if (c > 128) 
    { 
     printf("This is unsigned number %d\n", c); 
    } 
    else 
    { 
     printf("This is signed number %d\n", c); 
    } 
} 

在這種情況下,當我們初始化具有範圍從-127到128的帶符號字符時會發生什麼?它沒有環繞,因爲它是未定義的行爲,但真正發生了什麼?C中的類型轉換混淆

我得到-1的結果,但如何和爲什麼?

+1

你在問未定義行爲會發生什麼?真的嗎? –

+0

這不是未定義的行爲,而是定義了實現。所以這取決於你的編譯器。 –

+0

@JensGustedt將char傳遞給%d,好嗎? –

回答

3

這不是明確定義的行爲。標準的相關部分6.3.1.3§3:

否則,新類型有符號且其值不能表示爲 ;結果是實現定義的或實現定義的信號被引發。

這意味着結果依賴於編譯器。也許,你的編譯器會嘗試基於二進制補碼進行某種換行 - 這是最常見的行爲。這不是未定義的行爲。

請注意,char類型可以有符號或無符號的,當然這也取決於編譯器。