int a=-10
unsigned int b=5
printf(“%u”,a+b)
為什么輸出結果位4294967291(即2^32-5)
我說一下我的思路 求指正
int與unsigned int相加都會轉成unsigned int(因為unsigned int資料位為32位,而int為31位)
(int)a儲存的是10000000 00000000 00000000 00001010(因為都為32位且都為十進制轉換都不會改變)轉為unsigned int 就變成十進制
2^32+10再加上5就為2^32+15(與上方 2^32-5 相差了20)
我不知道我錯在哪 求大神點明
uj5u.com熱心網友回復:
沒錯,你可以用電腦上的計算器試試。-10 == 1111 .... 0110二進制
-10 +5 = -5
-5的無符號值就是 4294967291
uj5u.com熱心網友回復:
觀點和你的不一樣的。
注意,符號數和無符號數相加首先是將兩個資料型別統一,根據有符號和無符號相加,首先將有符號型別提升到無符號(因為型別向高提升)型別統一之后再計算加法。
-10提升到無符號之后是:4294967286,然后再加上5,正好是:4294967291
注意一個型別隱式提升,提升的方向是更高的,表示范圍更大的提升。
uj5u.com熱心網友回復:
為什么提升到無符號 是4……286 不是4……306嗎 為什么是2^32-10 而不是加10?uj5u.com熱心網友回復:
int -->unisgned int這是C語言的規定吧
uj5u.com熱心網友回復:
符號不同,實作方式不同,內部存盤不同,運算封裝不同,怎么能相加!uj5u.com熱心網友回復:
先假設 int 和 unsigned int 的資料位(符號位 + 值位)都占 32 位,那么如果有 int a = -10,意味著 a 存的就是 -10(見附注)。如果是從 unsigned int 轉換到 int 的話會比較麻煩,但對于從 int 轉換到 unsigned int,C 語言定義了一個很簡單的辦法:觀察 int 的值是否為負數,如果不是,保持值不變;如果是,就給這個 int 加上 UINT_MAX + 1,這里即加上 2^32。那么 a + b 自然就變成了 (2^32 - 10) + (5)。(附注:-10 用補碼來看,就是 1111 1111 1111 1111 1111 1111 1111 0110,但不建議這么看負數,除非你確定你的電腦使用的就是補碼,而不是反碼等其它編碼方式,來存盤負數)
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/93071.html
標籤:C語言
上一篇:求解
