[英]How does casting between Cs default int type and <stdint.h>'s intXX_t types work?
[英]How does type conversion and integer promotion work for stdint.h?
在 C 中,我了解標准類型的類型轉換、integer 提升、轉換等,但是 stdint.h 類型如何影響這一點?
對於類型排名,規則 state:
那么假設一個 int 是 32 位的,這是否意味着int > int32_t = uint32_t > short int
在排名中?
另外,stdint.h 類型是否也受 integer 提升的影響? 例如,如果我嘗試向 uint32_t 添加一個帶符號的字符,它們都會被提升為無符號整數嗎?
回答你的第一個問題:沒有。 由於int32_t
通常是用這樣的 typedef 定義的
typedef int int32_t;
它與int
相同,並且與int
具有相同的等級。
回答第二個問題:是的。 Integer促銷仍然適用。 stdint.h 中定義的類型的行為就像它們作為別名的類型一樣。
順便說一句,為了對你的編譯器的行為更有信心,你可以在你的編譯器中測試所有這些東西,方法是編寫這樣的無效代碼並仔細查看錯誤消息,這將(如果你有一個好的編譯器)揭示右側表達式的類型:
void * x = (signed char)-1 + (uint32_t)0;
按照C標准
— 任何標准 integer 類型的等級應大於任何具有相同寬度的擴展 integer 類型的等級。
2 的補碼表示的確切 integer 類型被定義為標准 integer 類型的 tyoedef 別名。
來自 C 標准(7.20.1.1 精確寬度 integer 類型)
- ...和(對於帶符號的類型)具有二進制補碼表示的,它應定義相應的 typedef 名稱。
所以當類型 int 有 32 位時這個關系(對於 2 的補碼表示)
int > int32_t = uint32_t > short int
是正確的,除了關系int > int32_t
前提是類型int32_t
是 typedef 聲明引入的類型int
的別名。
另外,stdint.h 類型是否也受 integer 提升的影響? 例如,如果我嘗試向 uint32_t 添加一個帶符號的字符,它們都會被提升為無符號整數嗎?
這里unsigned char
類型的 object 被提升為int
類型,並且uint32_t
類型的 object 被提升為unsigned int
類型(假設int
具有 32 位)由於 integer 提升
來自 C 標准
如果 int 可以表示原始類型的所有值(受寬度限制,對於位域),則該值被轉換為 int; 否則,它被轉換為一個無符號整數。 這些稱為 integer 促銷。 58) integer促銷后所有其他類型不變。
然后由於通常的算術轉換, int
類型的 object 被轉換為unsigned int
類型。
來自 C 標准(6.3.1.8 常用算術轉換)
否則,兩個操作數都轉換為無符號 integer 類型,對應於帶符號 integer 類型的操作數的類型。
請注意名稱uint32_t
可以是 typedef 聲明引入的類型unsigned int
的別名。 在這種情況下, uint32_t
與unsigned int
的類型相同。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.