簡體   English   中英

stdint.h 的類型轉換和 integer 提升是如何工作的?

[英]How does type conversion and integer promotion work for stdint.h?

在 C 中,我了解標准類型的類型轉換、integer 提升、轉換等,但是 stdint.h 類型如何影響這一點?

對於類型排名,規則 state:

  • 任何兩個帶符號的 integer 類型都不應具有相同的等級,即使它們具有相同的表示形式。
  • 任何無符號 integer 類型的等級應等於相應有符號 integer 類型(如果有)的等級。

那么假設一個 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 類型)

  1. ...和(對於帶符號的類型)具有二進制補碼表示的,它應定義相應的 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_tunsigned int的類型相同。

暫無
暫無

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

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