無符號翻轉引發的思考

2021-06-02 08:32:51 字數 555 閱讀 3110

前段時間大腦短路,碰到乙個有關無符號翻轉的問題。先將我的理解寫出來,如有不對的,歡迎拍板磚啊。

unsigned int i; 

for(i=9;i>=0;i--)

printf("%u",i);

執行這個程式,會不停的列印出i,直到cpu累了或者是斷電才會停止。為什麼會出現這種情況?我i不停的變小就不可能小於0嗎?恭喜你答對了,永遠不可能小於0。你要問為什麼,答案就是,i是乙個無符號變數,而無符號不可能是負的,如果是無符號當然無可厚非,會輸出你想要的結果。

實際上計算機是不知道有符號無符號的,這完全是人類為了方便計算而想出來的方法。不管正負,計算機都老老實實的用1和0去表示和計算,進行加減運算時(實際上減法也會當做加法進行運算),都會以補碼的形式進行計算,編譯器會根據我們指定的型別給出我們結果(比如以無符號輸出就用%u)。所以上面例子中,每次都加-1,而-1在計算機中的表示為8個f(也就是32個1),當加到0的時候再加-1結果為16個1,這時候如果你以無符號形式輸出的時候就翻轉為無符號最大值了(注意是無符號,32位都表示值)。當從最大值減到0的時候又會重複上面的過程。而ffffffff減1再取反就是-1了。

有符號數和無符號數混用的思考

參考文章 1 c語言中無符號數和有符號數之間的運算 2 負數在計算機中怎樣儲存 3 二進位制減法 原碼 10進製轉換成2進製是原碼,只不過正數的原碼是本身符號位為0,負數的原碼符號位為1 以下篇幅均以單位元組為例 10進製1的原碼是0000 0001,10進製 1的原碼是1000 0001 反碼 正...

有符號數和無符號數的轉換及思考

1 有符號數和無符號數的表示 三者的最高位均為符號位.我以前一直沒弄明白的是為何8位補碼的表示範圍是 128 127,今天查閱了相關資料,於此記下。仍然以8位為例 原碼 原碼的表示範圍 127 0,0 127,共256個數字。正0的原碼是0000 0000,負0的原碼是1000 0000,有正0負0...

停課引發的思考

快一周沒去機房了,好懷念在在學習的日子,以至於經常夢到自己在設計程式。唉,說到底還是自己太貪玩,沒有珍惜這來之不易的學習環境。當10期大部分人因遲到被禁止進的時候,我們幾個在大大咧咧的學習,甚至連週末兩天都沒有做到按時上課。結果,讓公尺老師動怒,被判了個無期徒刑。失去了才知道珍惜,也好,這樣再次得到...