就如同int a;同樣,int 也能被其它的修飾符修飾。除void類型外,基本數據類型以前均可以加各類類型修飾符,類型修飾符有以下四種:
1.signed----有符號,可修飾char、int。Int是默認有符號的。
2.unsigned-----無符號,修飾int 、char
3.long------長型,修飾int 、double
4.short------短型,修飾int學習
咱們主要來看一下signed和unsigned與int之間的聯繫與區別。
什麼叫作有符號,什麼叫作無符號
這個問題其實很簡單,好比:5和-5,5沒有符號,-5有符號。簡單吧。可是在計算機中的這種符號可不簡單。咱們分別來看一下:
在說明有符號和無符號的區別以前,咱們必須先知道溢出是怎麼回事,由於有無符號的根本緣由能夠說就是由於數據出現了溢出現象致使的。
溢出:
咱們知道數據在計算機中以二進制存儲,而且佔據必定的空間,而這個空間屬於計算機分配的空間。
計算機給int分配32位或者16位(不一樣電腦可能不一樣)的空間,既然空間有限,那麼數值就會有限制,就會存在最大值與最小值這一說,好比:假設int類型的分配16位,無符號類型的最大值爲1111 1111 1111 1111(16個1),也就是65535,若是超過了65535,這就叫作溢出,那該怎麼辦? 若是要輸出65536,那將會輸出個什麼東西呢? 下面和你們一塊兒看一下:
疑問:有的讀者會問:65535這麼小啊,我記得本身在輸出比65535大好多的數也可以輸出啊。
解答: 那就是有無符號的定義和你電腦編譯器的緣由了。64位的電腦和32的電腦但是不同的哦。並且int佔幾個字節是與電腦編譯器有關的。不過如今大部分電腦int佔4個字節,即32位,那麼他的最大值但是32個1(二進制)左右的數量級,你實驗過這麼大的數嗎?spa
1.無符號整型(unsigned int)
(1)咱們都知道整型是4個字節(有些編譯器不一樣,可能會是2個),即32位,無符號整型固然也爲32位。
(2)既然是32位,無符號整型的取值是32個0~32個1,即:0~4294967295
(3) 咱們舉個例子:32位有點長,因此咱們拿16位的unsigned short int 來舉例。
short int 是16位的,無符號的範圍是0~65535
就拿十進制的32767(如下的全部舉例均拿這個數字來講事了)來講,它的二進制爲:
0111 1111 1111 1111
對於無符號的整型32767來講,它的二進制的最高位稱爲數據位,即那個0就是數據位,數據位是要參與運算的,若是咱們把0改爲1,即16個1,它的十進制就是65535(就是2的15次方+2的14次方...一直加到2的0次方),這是不一樣於有符號整型的。
(4) 爲了進行理解(3)中的含義,作一個程序說明:.net
定義的時候a=32767,也就是0111 1111 1111 1111,輸出的依然是32767,
a+1=32768, 二進制爲1000 0000 0000 0000,輸入依然爲32768。
根據(3)中講解的,無符號整型的二進制最高位爲數據位,數據位爲0爲1都是按照正常來算的。code
2.有符號整型((signed)int)(1)int類型默認是有符號的,因此int其實是signed int ,咱們一般省略signed
(2)有符號整型也是32位。
(3)它的取值範圍就與無符號整型不一樣了。它的範圍是-2147483648~2147483647這個範圍能夠理解爲無符號整型的一半變成了負數。圖片
32位有點長,因此咱們拿16位的short int 來舉例。
short int 是16位的,有符號的範圍是-32768~32767get
這個時候可能就有人發問了,32768用二進制表示爲1000 0000 0000 0000,那麼這個負的32768的負號又怎麼理解呢?看下面
(4)舉個例子;
仍是以32767爲例子,它的二進制爲:
0111 1111 1111 1111
對於有符號整型32767來講,它的二進制最高位稱爲符號位(而不是數據位了),符號位顧名思義就是決定正負號的,規則:0是正,1爲負。
(5)列舉一個程序理解(4)的內容編譯器
能夠看出此時的結果居然是這個樣子的。爲何呢?怎麼回事?
其實在計算機中,負數是並不存在的,它是以二進制補碼的形式表示和存放。什麼是補碼呢?it
(6)什麼是補碼,補碼的運算。
咱們仍是列舉一個簡單的例子吧!就用-6.io
咱們通過以上的學習已經知道負數的符號位爲1,因此:
(1)-6的二進制: 1000 0000 0000 0110(稱爲原碼,原碼是計算機顯示給個人)
(2)對原碼求反碼:1111 1111 1111 1001(稱爲反碼,保持符號位不變,將原碼中的0變1,1變0)
(3)對反碼加1:1111 1111 1111 1010(稱爲補碼,補碼是計算機中存儲負數的形式)
在計算機中,若是存儲的二進制是1111 1111 1111 1010,那麼顯示在咱們前臺的十進制數字就是-6。即:負數在計算機中是以該負數的二進制的補碼形式存儲的。編譯
(7)瞭解了什麼是補碼後,再來看咱們上述說的那個程序:
32767的二進制爲:0111 1111 1111 1111
咱們來計算一下c的值爲何會等於-32767。
c=32767+2,c的二進制爲:1000 0000 0000 0001(32767的二進制+2),c的這個二進制是在計算機中存儲的補碼,須要將它轉換爲原碼,也就是將c的二進制數減一再取反。獲得的二進制原碼爲:1111 1111 1111 1111。咱們已經說過,符號位爲1,表示負值,並不參加運算,因此此二進制的十進制爲:-32767。
可是,上述中,c的原碼的確是1111 1111 1111 1111,c在計算機中存儲的補碼也的確是1000 0000 0000 00010。可是-32767的由來卻有另外一種理解,c的補碼是16位,32位編譯器中有32位的二進制,也就是說在16位補碼的前面還有(32-16=16)位的虛位數,並不屬於計算機給short int分配的空間,可是這16位的位數當數表示正時爲0,當數表示負數時爲1。而且前16位的數字所有都與二進制倒數第8位的數字一致。也就是說:
c 的補碼是 1...1 1000 0000 0000 0010(1..1表示16個1)
咱們能夠這樣計算:-2的7次方+2的1次方=-32767,這種理解廣泛被大衆所接受,並且避免了原碼的概念。
(8)經過程序也能夠發現一個規律,int的取值範圍是-32768~32767,把頭尾鏈接起來造成一個環就能夠了。