什麼才是unsigned

2021-07-10 07:05:16 字數 1472 閱讀 9644

c語言中提供了很多整數型別(整型),主要區別在於它們取值範圍的大小。int代表有符號的整數,也就是說,用int宣告的變數可以是正數也可以是負數,也可以是零,但是只能是整數。

比如:int a = 3; int b = 0; int c = -5;

以上這些都是合法的。

int的取值範圍因機器而異,一般而言,在較舊的pc上,int值在記憶體中一般是按2個位元組(16位)進行儲存的,在較新的pc以及工作站和大型機上,int值在記憶體中一般是按照4個位元組(32位)進行儲存的。

c語言中將基本資料型別劃分為signed(有符號)和unsigned(無符號)兩大類。

例如,初始化變數int a = -3;其實它等價於signed int a = -3;關鍵字signed在這裡可以省略,因為c語言預設就是有符號型別的,如果要定義無符號型別的數(也就是0和正整數)可以這樣定義,unsigned int b = 5;

為了說明清楚signed和unsigned的區別,首先需要了解資料在記憶體中是如何儲存的,在計算機中所有的資料都是按照二進位制進行儲存的(以下假設在字長為2個位元組的機器上來表示)。

舉個例子來說,unsigned  int a = 1; 變數a在記憶體中就是以00000000 00000001來儲存的,用圖表的形式表示:

因為這裡是unsigned  int,它是無符號整型,所以的它的16位全部用來表示資料。

int b = -1;

這裡情況就稍微有點複雜了,注意數字1和-1在記憶體中的儲存是完全不一樣的,請看,

首先1的原碼是                     00000000 00000001

其次取它的反碼是                 11111111 11111110

最後在其反碼的基礎上加上1   11111111 11111111

得到-1的補碼是,11111111 11111111

用圖表的形式表示:

從上圖中可以看出,int用15位來表示乙個數字,第1位被符號位占用了,其實大家應該不難看出在數學中-1是負數中最大的整數,所以這裡看到它的各個位都置1,對應於二進位制來講就是最大的數了,計算機就是按照符號位來識別該數是正是負,所以第一位只起到標識的作用並不作為資料位來使用,而其餘的15位才是真正的資料位。以補碼的形式來儲存有個好處那就是計算機將負數的運算當作加法來處理了。那麼將乙個有符號的數賦給乙個無符號的數會發現乙個很有趣的現象,比如:

unsigned int a;

int b = -1;

a = b;

printf("a=%u",a);

輸出a=65535,這個結果是怎麼出來的呢?其實很簡單,b=-1,根據上圖-1在計算機中的資料位是1111111 11111111,注意是資料位,是要去掉符號位的,所以是15位,a是無符號型別的整數,將b賦給a,自然a就是1111111 11111111,也是15位第一位補0,轉換成十進位制就是65535,它也是unsigned int範圍的最大上限(0~65535 216-1),-1是最大的負整數轉換成正整數當然也是最大了,這個應該很好理解了。

什麼才是好工作

我有個有趣的觀察,外企公司多的是25 35歲的白領,40歲以上的員工很少,二三十歲的外企員工是意氣風發的,但外企公司40歲附近的經理人是很尷尬的。我見過的40歲附近的外企經理人大多在一直跳槽,最後大多跳到民企,比方說,唐駿。外企員工的成功很大程度上是公司的成功,並非個人的成功,西門子的確比國美大,但...

學習!什麼才是學習?

原帖 一 看書 買一堆書,有空看看。看書,這是典型的假學習。看書看不懂還在看,就是假學習,欺騙自己,安慰自己正在學習而已。專業書都寫得很好,但大都是寫給已經懂的人看的。看書的最大作用就是證明自己看書是學不到東西的,然後只有尋找其他途徑。建議 把書合上,想一想,你想學的東西東西到底是要幹什麼用的,要掌...

mysql中的unsigned是什麼意思

unsigned 為 無符號 的意思,unsigned,zerofill 既為非負數,用此型別可以增加資料長度,例如如果 int最大是65535,那 int unsigned zerofill 最大 就是 65535 2 unsigned 為 無符號 的意思 unsigned既為非負數,用此型別可以...