在 C 中,我了解標準型別的型別轉換、整數提升、強制轉換等,但是 stdint.h 型別如何影響到這一點?
對于型別排名,規則規定:
- 任何兩個有符號整數型別都不應具有相同的等級,即使它們具有相同的表示。
- 任何無符號整數型別的等級應等于相應的有符號整數型別的等級,如果有的話。
所以假設一個 int 是 32 位,這是否意味著int > int32_t = uint32_t > short int排名?
此外,stdint.h 型別是否也受到整數提升?例如,如果我嘗試將有符號字符添加到 uint32_t,它們都會被提升為無符號整數?
uj5u.com熱心網友回復:
回答你的第一個問題:不。因為int32_t通常用這樣的 typedef 定義
typedef int int32_t;
它與 相同int并且將具有相同的等級int。
回答第二個問題:是的。整數提升仍然適用。stdint.h 中定義的型別的行為就像它們是別名的型別一樣。
順便說一句,為了對編譯器的行為更有信心,您可以通過撰寫這樣的無效代碼并仔細查看錯誤訊息來測驗編譯器中的所有這些內容,這將(如果您有一個好的編譯器)揭示右側運算式的型別:
void * x = (signed char)-1 (uint32_t)0;
uj5u.com熱心網友回復:
根據 C 標準
— 任何標準整數型別的秩應大于任何具有相同寬度的擴展整數型別的秩。
2 的補碼表示的確切整數型別定義為標準整數型別的 tyoedef 別名。
來自 C 標準(7.20.1.1 精確寬度整數型別)
- ...并且(對于有符號型別)具有二進制補碼表示,它應定義相應的 typedef 名稱。
因此,當型別 int 具有 32 位(用于 2 的補碼表示)時,這種關系
int > int32_t = uint32_t > short int
是正確的,除了關系int > int32_t提供的型別是由 typedef 宣告引入的型別int32_t的別名。int
此外,stdint.h 型別是否也受到整數提升?例如,如果我嘗試將有符號字符添加到 uint32_t,它們都會被提升為無符號整數?
由于整數提升,此處型別的物件unsigned char被提升為型別int,并且型別的物件uint32_t被提升為型別unsigned int(前提是int具有 32 位)
來自 C 標準
如果 int 可以表示原始型別的所有值(受寬度限制,對于位域),則該值將轉換為 int;否則,它將轉換為無符號整數。這些被稱為整數促銷。58) 整數提升不會改變所有其他型別。
然后由于通常的算術轉換,型別的物件int被轉換為型別。unsigned int
來自 C 標準(6.3.1.8 常用算術轉換)
否則,兩個運算元都轉換為與帶符號整數型別的運算元型別對應的無符號整數型別。
請注意,名稱uint32_t可以是unsigned inttypedef 宣告引入的型別的別名。在這種情況下uint32_t是與 相同的型別unsigned int。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/455481.html
