[英]What type conversion happen when I assign a short to a char?
如果滿足以下條件,會發生什么類型的轉換:
short s = 1234;
char c = s;
會先將s
轉換為int
,然后將此int
轉換為char
並分配給c
嗎? 還是將s
直接轉換為char
並分配給c
?
s
不會轉換為int
。
在這里1中,我們使用超出char
范圍的值初始化c
。 普通char
可以是有符號的也可以是無符號的(大多數編譯器都有一個切換選項)。 如果對char
進行簽名,則相關標准文本位於[conv.integral] / 3中:
如果目標類型是帶符號的,則該值可以用目標類型(和位字段寬度)表示,則該值不變。 否則,該值是實現定義的。
“實現定義的”意味着您的編譯器必須記錄在這里發生的情況。 在現代系統上的常見實現是,多余的位將從最高有效端開始被截斷。
重寫此代碼以不依賴於實現定義的行為是一個好主意。 這樣,當您在其他系統上進行編譯時,行為就不會改變。
如果char
是未簽名的,則上一段涵蓋了這種情況:
如果目標類型是無符號的,則結果值是與源整數一致的最小無符號整數(取模2 n ,其中n是用於表示無符號類型的位數)。 [注意:在二進制補碼表示中,此轉換是概念性的,並且位模式沒有任何變化(如果沒有截斷)。 —尾注]
因此,所得的char值應為1234-1024 = 210
。
1這篇文章假設您使用8位字節的系統。 周圍不是這種情況,有一些專門的芯片,在那些系統上, char
可以保持1234
的值就可以了,不需要更改任何值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.