2012-05-02 16 views
0
#include<stdio.h> 

int main() 
{ 
    char a = 128; 
    char b = -128; 
    printf("a is %d -- b is %d \n",a,b); 

    return 0; 
} 

的輸出是:C程序

a is -128 -- b is -128 

作爲符號字符的範圍是從0到127,從上面的代碼可以請解釋該值是如何分配給超出邊界值。

在此先感謝。

+5

爲什麼簽名的字符範圍是從0到127?有符號的字符範圍是從-128到127. – dreamlax

+0

沒有定義有溢出時的行爲。 – BLUEPIXY

+0

更具體地說,在C標準中未定義* signed *溢出的行爲,但定義了帶符號溢出的行爲。這可能與標準沒有特別要求用2的補碼形式實現有符號的值有關(儘管這是迄今爲止最常見的實現) –

回答

4

char類型的範圍取決於實現。如果它是帶符號的類型,則其範圍至少爲-128到127,如果它是無符號類型,則其範圍至少爲0到255(這些是類型必須支持的範圍,根據實現情況,該類型支持的範圍實際上可能會大於此範圍)。

另請注意,當您將整數分配給無法保存該值的帶符號類型時,您正在調用未定義的行爲。因此,將128分配給不能保持128的帶符號字符(例如,當128大於CHAR_MAX時)會調用未定義的行爲。在這種情況下,它已經包裝到-128,因爲它與擁有128的無符號字符類型共享相同的字節表示,但是與所有未定義行爲的實例一樣,您不能保證在所有實現中都會出現這種情況。

+0

嚴格地說你錯了。 'char'總是1個字節,但是C標準沒有說一個字節必須是8位。所以你的數字-128到127並不是真的正確(不是我曾經見過一個CHAR_BIT!= 8的平臺,但是是的)。 – orlp

+1

假設char是8位類型最終是不安全的 - 某些TI DSP是一個相對當前的反例。是的,這是一種特殊用途的設備,但相對通用的代碼可以在其他方面輕鬆地移植到其中,而在重新安裝更大系統的體系結構或更換子系統時,我發現這種情況發生了很多。 –

+0

當我們嘗試爲上述原型代碼的變量a和b分配值130和-130時會發生什麼? – Joy