無符號在計算機中的操作過程,該怎麼解決

tags:    時間:2013-12-26 03:56:19
無符號在計算機中的操作過程
前段時間大腦短路,碰到一個有關無符號翻轉的問題。先將我的理解寫出來,如有不對的,歡迎拍板磚啊。

  大家都知道類型有有符號和無符號之分,顧名思義有符號有負數表示,而無符號只有正數。如果判斷一個無符號變數小於0,就會出現錯誤,特別是在循環中,會陷入死循環。例如:
  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了。

------解決方案--------------------
樓主只要記住,二進位擺在那裡,是不會變的。

只有是同寬變數互相=賦值,都是二進位拷貝,二進位是不會變的,怎麼解析是編譯器的事。

不同寬的變數互相=賦值,長的按照二進位截短(與位元組序無關),短的擴寬(根據短變數有無符號,填充符號位/填充0)


------解決方案--------------------
有符號與無符號只是表現形式,而不是存儲形式,LZ一定要區分什麼是給人看的,什麼是給計算機看的……
簡單來說,(1010 0101)補 的真值是多少?不知道,這是一個存在二義性的數字,即可以認為是十進位的-179,也可以認為是十進位的325,關鍵就在於你怎麼去解析它……
至於LZ所說的減法,不好意思,計算機不會算減法,計算機只會先把一個負數變成補碼,然後算補碼加法,至於加完以後怎麼樣,計算機就不管了,因為怎麼解析並不是計算機的工作……
如果LZ想把這個事情徹底弄明白,最簡單的辦法就是去看計算機組成原理,定點數運算這部分內容,這裡面會解決你所有的疑問,你會清楚的了解cpu每一步的操作過程,以及數制轉換關於整數部分的全部內容……
------解決方案--------------------
無符號整型數做0減1的機內操作就是,0+0xffff=0xffff,所以依然大於0.
------解決方案--------------------
探討
無符號整型數做0減1的機內操作就是,0+0xffff=0xffff,所以依然大於0.

推薦閱讀文章

Bookmark the permalink ,來源:互聯網