簡體   English   中英

如何在 Cs 默認 int 類型和<stdint.h>的 intXX_t 類型有效嗎?

[英]How does casting between Cs default int type and <stdint.h>'s intXX_t types work?

我正在處理一個代碼框架,它有很多預先存在的代碼,使用 C 中的常規舊int類型。但是,我需要編寫的代碼要求我使用固定長度的int32_t 但是,我需要能夠從常規代碼中獲取int方面的輸入,並輸出到也只是常規int變量。 int32_tint是否會保留變量的值或它的特定數據表示(在這種情況下,我可能需要進行位移以保留該值)。 相反,從intint32_t引入任何並發症? 任何答案都將不勝感激,但特別是任何一般和具體解釋stdint庫的轉換約定的stdint

Cs 默認int類型和 <stdint.h> 的intXX_t類型之間的轉換如何工作?

intXX_tint大小、范圍和有效類型相同時,不會真正發生“工作”。

intXX_t范圍比int更寬時,所有值都保留在新類型中。 高位是符號擴展。

intXX_t范圍比int窄時,超出范圍的值將以實現定義的方式轉換。 通常是一種類似於環繞的模式(低位相同)

intXX_tint具有相同的范圍時,類型可能不同,但通常是相同的。 在選擇代碼中(與_Generic ),差異很重要。


int有各種大小和編碼。

  • 32 位(2 的補碼):這很常見,尤其是在台式計算機上。

  • 16 位(2 的補碼):這在小型嵌入式處理器中很常見。

  • 其他:包括非 2 的補碼、某些 64 位圖形處理器上的 64 位、舊或深奧機器上的一些非 2 次冪。 對於OP的關注,簡單地知道別人的存在,但它是不太可能OP需要端口代碼或從這樣的機器。


int32_tint是否會保留變量的值或它的特定數據表示(在這種情況下,我可能需要進行位移以保留該值)。

不需要位移。

  • 32 位(2 的補碼):將int32_tint不會丟失任何值信息。 在某些情況下,可能會發生類型更改。 int32_t可能被定義為long類型,但更可能是int32_t, int是完全相同的類型。

  • 16 位(2 的補碼):將int32_tint會丟失信息,因為范圍要小得多。 在這樣的機器上,最好將int32_tlong


相反,從intint32_t引入任何並發症?

  • 32 位(2 的補碼):不太可能有任何問題。

  • 16 位(2 的補碼):有些情況值得考慮,因為int32_t更寬,占用更多空間。


寫得好的代碼不太可能引起問題,但很多代碼沒有考慮可移植性。

對於 OP 的情況,我建議創建宏,而不是直接投射。 由於新的工作要求,這將有助於跟蹤對代碼庫的更改。 此外,替代方案可以很容易地用於調試范圍減少/增加問題。

// Use names per your coding style
#define inttoint32(i) ((int32_t) (i))
#define int32toint(i32) ((int) (i32))

暫無
暫無

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

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