[英]Conversion from char to int
我正在學習C ++語言達三周時間,從char到int的轉換遇到了問題。
int main()
{
int a = 200;
char h = a;
int b = h;
cout << h << "\n";
cout << b << "\n";
keep_window_open();
return 0;
}
如果我將a的值轉換為char,則h的值將成為ASCII表上的一個字符,但是如果我將h值轉換回int,則無法獲取200的值,為什么?
在具有8位字符(即大多數字符)的系統上,200超出了范圍,因為對char進行了簽名,並且您只有7位用於存儲值。
char
可以是簽名的,也可以是未簽名的,實現必須記錄哪個(您的簽名)。
大小也是實現定義的(ID)(您通常是8位)。
同樣,在可能的情況下,將轉換定義為保持價值。
所以:
200 (int)
-56 (char) ID as not in range for char and char is signed
-56 (int) value-preserving widening conversion
是您的轉換順序。
6.3.1.3有符號和無符號整數
1將整數類型的值轉換為
_Bool
以外的其他整數類型時,如果該值可以用新類型表示,則該值不變。
2否則,如果新類型是無符號的,則通過重復添加或減去新類型所能表示的最大值之前的值,直到該值在新類型的范圍內,來轉換該值。60)
3否則,將對新類型進行簽名,並且無法在其中表示值; 結果是實現定義的,還是引發實現定義的信號。
因為值200
不適合char
,至少在大多數機器上都是這樣。 如果char
的范圍是[-128,127]
(通常是這種情況),則當您將200
轉換為char
,您將獲得實現定義的值(甚至可能是信號,但最有可能是-56)。
當然,-56在我所知道的任何編碼中都不是合法值,但是大多數輸出設備會將其視為unsigned char
,其值為200。在某些地方,您需要注意但是; 例如, <cctype>
的函數將其參數視為在[0, UCHAR_MAX]
范圍內[0, UCHAR_MAX]
如果將其傳遞給-56,將導致未定義的行為。
如果要獲得相同的值,則必須使用unsigned char
。 例如
unsigned char h = a;
根據C ++標准(4.7積分轉換)
3如果目標類型是帶符號的,則該值可以用目標類型(和位域寬度)表示,則保持不變; 否則,該值是實現定義的。
似乎默認情況下,您的編譯器將char
類型視為具有char
類型的char
因為在signed char
中不能表示200值,因為char類型的最大值是127
因此對應於200的位組合被解釋為-56
。 當將其分配回int類型的對象時,則將-56分配給該值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.