簡體   English   中英

從char轉換為int

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM