我想要以下想法: I have short a = -4;and I have an unsigned short b = (unsigned short)a;
When I printf("%hu", b),為什么不列印4?如何使用強制轉換將負整數轉換為正整數?
uj5u.com熱心網友回復:
short并且unsigned short通常是 16 位整數。因此,簽名版本 ( short) 的限制是 -32768 到 32767,而unsigned short. 從有符號轉換為無符號只是包裝值,因此 -4 將被轉換為 65532。
這是在 C 語言中轉換為 unsigned 作品的方式。
如果您接受使用加法/減法,您可以:
65536l - (unsigned short) a
該操作將使用至少需要 32 位整數型別的long型別(因為l后綴)。這應該成功地將任何負短整數轉換為其絕對值。
uj5u.com熱心網友回復:
聽起來您想要數字的絕對值,而不是演員表。在C我們有abs/ labs/llabs該功能發現<stdlib.h>。
如果您提前知道該值為負數,您也可以將其取反:-a。
uj5u.com熱心網友回復:
如果你不是僅僅希望得到絕對值,你應該使用abs()的功能<stdlib.h>。
否則,當你進行這樣的轉換時,你會觸發 C17 6.3.1.3 中的以下轉換規則:
否則,如果新型別是無符號的,則通過重復加或減一個新型別可以表示的最大值來轉換該值,直到該值在新型別的范圍內。60)
腳注 60) 很重要的地方:
- 這些規則描述了數學值的算術,而不是給定型別運算式的值。
數學值意味著我們在進行計算時不應該考慮環繞等。符號格式(2 的補碼等)也無關緊要。應用此規則,則:
- 您具有數學價值
-4并從 轉換signed short為unsigned short。 - 我們比最大值多加一個。也就是說
-4 USHRT_MAX 1,UINT_MAX可能是 2^16 = 65535。 -4 65535 1 = 65532. 這在新型別的范圍內unsigned short。- 我們在第一次嘗試時就進入了范圍,但是“反復添加或減去”本質上與取模值 (max 1) 相同。
此轉換定義明確且可移植 - 您將在所有short16 位系統上獲得相同的結果。
uj5u.com熱心網友回復:
這不是鑄造的作業方式。
你在b那里做什么稱為整數溢位。因為bis 是型別unsigned,你試圖讓它保持一個負數。這將導致整數溢位,并將回傳65532。
看起來您想要的是abs()函式及其多種型別。見這里。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/369513.html
上一篇:為二維陣列釋放連續的記憶體塊
