#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,從上面的代碼可以請解釋該值是如何分配給超出邊界值。
在此先感謝。
#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,從上面的代碼可以請解釋該值是如何分配給超出邊界值。
在此先感謝。
char
類型的範圍取決於實現。如果它是帶符號的類型,則其範圍至少爲-128到127,如果它是無符號類型,則其範圍至少爲0到255(這些是類型必須支持的範圍,根據實現情況,該類型支持的範圍實際上可能會大於此範圍)。
另請注意,當您將整數分配給無法保存該值的帶符號類型時,您正在調用未定義的行爲。因此,將128分配給不能保持128的帶符號字符(例如,當128大於CHAR_MAX
時)會調用未定義的行爲。在這種情況下,它已經包裝到-128
,因爲它與擁有128的無符號字符類型共享相同的字節表示,但是與所有未定義行爲的實例一樣,您不能保證在所有實現中都會出現這種情況。
爲什麼簽名的字符範圍是從0到127?有符號的字符範圍是從-128到127. – dreamlax
沒有定義有溢出時的行爲。 – BLUEPIXY
更具體地說,在C標準中未定義* signed *溢出的行爲,但定義了帶符號溢出的行爲。這可能與標準沒有特別要求用2的補碼形式實現有符號的值有關(儘管這是迄今爲止最常見的實現) –