關于無符號數的原反補碼以及整形提升:
先簡單介紹一下原碼、反碼、補碼:
十進制的數轉化為二進制就是原碼了,第一位是符號位(1是負、0是正),無符號數就是叫你別管第一位,原碼除了符號位全部0變1、1變0就是反碼了,反碼+1就是補碼了,而計算機中的存盤及運算都是按補碼的,搞定,
再簡單介紹一下整形提升:
任何存盤空間小于4個位元組的變數運算時在cpu都會發生整形提升,補符號位值補至4個位元組即32個bit位(是變數的補碼進行整形提升),
好了,分別舉一個栗子,一目了然,
下面是一段極其簡短的c語言代碼
#include <stdio.h>
int main()
{
signed char a = -1;//有符號數 字符a
unsigned char b = -1;//無符號數 字符b
printf("%d,%d", a, b);//結果為-1,255
return 0;
}
-
輸出 signed char a 的程序:
signed char a 的原碼 10000001(char型別是8個bit位)
反碼 11111110
補碼 11111111
使用 C庫函式 printf 將 char 型別變數發送格式化輸出到標準輸出 stdout 時會先對 char 變數進行整形提升
整形提升后(提升至32個bit位):
補碼 11111111111111111111111111111111
反碼 11111111111111111111111111111110
原碼 10000000000000000000000000000001(即-1,輸出的-1就是這么來的) -
輸出 unsigned char b 的程序:
unsigned char b 的原碼 10000001
反碼 11111110
補碼 11111111
同上,會發生整形提升,
因為是無符號數所以整形提升的時候當成正數補0,
整形提升后:
補碼 00000000000000000000000011111111
反碼 00000000000000000000000011111111(無符號數和正數的原碼、反碼、補碼相同)
原碼 00000000000000000000000011111111(即255,輸出的255就是這么來的)
感謝閱讀~~~
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/265915.html
標籤:其他
上一篇:研一寒假總結
