我在一個代碼框架中作業,該框架具有許多使用 C 中的常規舊int型別的預先存在的代碼。但是,我需要撰寫的代碼要求我使用固定長度int32_t。但是,我需要能夠從常規代碼中獲取輸入int,并輸出到也只是常規的變數int。是否強制轉換int32_t以int保留變數的值或它的特定資料表示(在這種情況下,我可能需要進行位移以保留該值)。相反,轉換 fromint是否會int32_t引入任何并發癥?任何答案都將不勝感激,但特別是任何一般和具體解釋stdint庫的鑄造約定的答案。
uj5u.com熱心網友回復:
Cs 默認
int型別和 <stdint.h> 型別之間的轉換如何intXX_t作業?
當intXX_t和int同樣大小,范圍和有效的型別,沒有“作業”真的發生。
當intXX_t范圍大于 時int,所有值都保留在新型別中。高位是符號擴展。
當intXX_t范圍比 窄時int,超出范圍的值將以實作定義的方式進行轉換。這通常是一種類似于環繞的模式(低位相同)
當與intXX_t具有相同的范圍時int,型別可能不同,但通常是相同的。在選擇代碼(與_Generic)中,差異很重要。
int 有各種大小和編碼。
32 位(2 的補碼):這很常見,尤其是在臺式計算機上。
16 位(2 的補碼):這在小型嵌入式處理器中很常見。
其他:包括非 2 的補碼、某些 64 位圖形處理器上的 64 位、舊或深奧機器上的一些非 2 次冪。對于OP的關注,簡單地知道別人的存在,但它是非常不可能OP需要埠代碼或從這樣的機器。
是否強制轉換
int32_t以int保留變數的值或它的特定資料表示(在這種情況下,我可能需要進行位移以保留該值)。
不需要位移。
32 位(2 的補碼):轉換
int32_t為int不會丟失任何值資訊。在某些情況下,可能會發生型別更改。int32_t可能已將型別定義為 along,但更有可能int32_t, int是完全相同的型別。16 位(2 的補碼):轉換
int32_t到int丟失資訊,因為范圍要小得多。在這樣的機器上,最好投射int32_t到long.
相反,轉換 from
int是否會int32_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))
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/331907.html
下一篇:遞回函式如何迭代?
