簡體   English   中英

為什么C / C ++自動將char / wchar_t / short / bool / enum類型轉換為int?

[英]Why does C/C++ automatically convert char/wchar_t/short/bool/enum types to int?

因此,如果我理解得很好,整數提升提供: char, wchar_t, bool, enum, short類型總是轉換為int (或unsigned int )。 然后,如果表達式中有不同的類型,則將應用進一步的轉換。

我理解得這么好嗎?

如果是,那么我的問題是:它為什么好? 為什么? 不要成為char/wchar_t/bool/enum/short不必要的? 我的意思是例如:

char c1;
char c2;
c1 = c2;

正如我之前描述的那樣, char ALWAYS被轉換為int ,所以在這種情況下自動轉換后,它看起來像這樣:

int c1;
int c2;
c1 = c2;

但我不明白為什么這樣好,如果我知道char類型足以滿足我的需要。

存儲類型永遠不會自動轉換。 只要您開始對這些變量進行整數算術( +- ,bitshifts,...),您就只能獲得自動整數提升。

char c1, c2; // stores them as char
char c3 = c1 + c2; // equivalent to
char c3 = (char)((int)c1 + (int)c2);

您詢問的轉換是通常的算術轉換整數促銷 ,在最新的ISO C標准的6.3.1.8節中定義。 它們被應用於大多數二元運算符的操作數(“二進制”意味着它們采用兩個操作數,例如+*等)。 (C ++的規則類似。在這個答案中,我只是參考C標准。)

簡而言之, 通常的算術轉換是:

  • 如果任一操作數為long double ,則另一個操作數將轉換為long double
  • 否則,如果任一操作數為double ,則另一個操作數將轉換為double
  • 否則,如果任一操作數為float ,則另一個操作數將轉換為float
  • 否則,對兩個操作數執行整數提升 ,然后應用其他一些規則將兩個操作數引入公共類型。

整數提升在C標准的6.3.1.1節中定義。 對於一種類型的窄於int ,如果類型int可容納的類型,則該類型的表達式被轉換成的所有值int ; 否則它被轉換為unsigned int (注意,這意味着unsigned short類型的表達式可以轉換為intunsigned int ,具體取決於類型的相對范圍。)

當聲明未指定參數的類型時,整數提升也應用於函數參數。 例如:

short s = 2;
printf("%d\n", s);

short值提升為int 對於非可變函數,不會發生此促銷。

為什么這樣做的快速答案是標准這樣說。

所有這些復雜性的根本原因是允許大多數CPU上可用的限制算術運算集。 使用這組規則,所有算術運算符(除了移位運算符,這是一種特殊情況)只需要處理相同類型的操作數。 沒有short + long加法運算符; 相反, short操作數被隱式轉換為long 對於比int更窄的類型,沒有算術運算符; 如果添加兩個short值,則兩個參數都將提升為int ,從而產生一個int結果(然后可以將其轉換回short )。

有些CPU可以對窄操作數執行算術運算,但並非所有CPU都可以執行。 如果沒有這種統一的規則, 無論是編譯器將不得不效仿不支持它直接算術表達式的行為將取決於什么樣的操作目標CPU支持的CPU改變狹隘的算術。 當前規則是跨平台一致性和充分利用CPU操作之間的良好折衷。

如果我理解得很好,整數提升提供:char,wchar_t,bool,enum,short類型總是轉換為int(或unsigned int)。

您的理解只是部分正確:短類型確實被提升為int ,但只有在表達式中使用它們時。 轉換在使用前立即完成。 當結果存儲回來時,它也“撤消”。

存儲值的方式與類型的屬性保持一致,使您可以控制將內存用於存儲的變量的方式。 例如,

struct Test {
    char c1;
    char c2;
};

將是小的四倍

struct Test {
    int c1;
    int c2;
};

在具有32位int的系統上。

將值存儲在變量中時,不會執行轉換。 如果轉換值或者如果對其執行某些操作(如顯式操作),則完成轉換

在執行算術運算,移位運算和一元運算時發生類型轉換。 看看標准說的是什么:

C11; 6.3.1.4實數浮點數和整數:

如果int可以表示原始類型的所有值(由寬度限制,對於位字段),該值將轉換為in t; 否則,它將轉換為unsigned int 這些被稱為整數促銷 .58)所有其他類型由整數促銷不變。

58. 整數提升僅適用於:通常算術轉換的一部分,某些參數表達式,一元+-~運算符的操作數,以及移位運算符的兩個操作數1由它們指定各條款


1.重點是我的。

這實際上取決於您的底層微處理器架構。 例如,如果您的處理器是32位,那就是它的原生整數。 在整數計算中使用其原生整數大小可以更好地進行優化。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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