C/C++整型,定義、表示、範圍,再看整型

來源:互聯網
上載者:User

    今天複習到C++的變數與基本類型,再看整形。

    一般情況下,我們會認為表示整數的資料類型叫做是整型,但實際上,C++中的整型包括表示整數、字元和布爾值的算術類型。理解這一點很簡單,首先,整數就是通常指的整數,比如-655536,-200,-100,0,50,65535等;而字元char類型的資料也是可以參加算術運算的,比如,字元'a'等於整型97的,可通過if('a'==97) cout<<"Yes"<<endl;驗證,程式輸出是YES,表示字元'a'與整數97是相等的;布爾bool類型也是可以參與算術運算的,例如,char a = 'a';bool b = true;printf("%d\n",a+b);則輸出的結果是98,表示a=97,b=1,而輸出是(97+1)==98;因此,嚴格的來說,整型是表示整數、字元和布爾值等算術類型的合稱。對於C++語言而言,整型就是包括整數型、字元型、布爾型。

整數型有:short、int、long等三種,其中,int為預設的整型,int類型的資料是一個機器字長,即你的CPU處理的位元,假設你的CPU是32位的,則一個int就是4個位元組。short類型是半個機器字長,則為int的一半;而long則為通常是一或者兩個機器字長,但在32位機器中,通常int與long是相同的,所以sizeof(int)==sizeof(long)==4是正確的。

字元類型有:char和wchar_t兩種,其中,char為大家所知的單位元組資料類型,8位元據。wchar_t是C++定義的,用於儲存擴充字元集的,比如中文字元,實際上wchar_t是用unsigned short類型來定義資料的。

布爾類型:用bool關鍵字來申明,其值只有真和假,即true和false,true的int類型值為1,false的int類型值為0。0值算術類型都代表著false,而任何非0值都代表著true。布爾類型通常正規的定義和初始化如,bool b = true,當然也可以定義和初始如bool b1=1,bool b2='b'等等;然而,假設有程式 bool b = 'b';cout<<b<<endl;printf("%c\n",b);則程式輸出為1和@臉型符號@,為什麼不是98或者true或者'b',這不僅說明了任何非0數值都是true,而且也證明了bool類型的true值就是1,所以,任何值為true的bool值輸出總是為1,而將1作為字元輸出時就是@臉型字元@。這個例子也證明了在本人發表的隨筆《if語句,C、C++、Java》一文中提到的,if(“xxxx”)內的條件運算式是true的原因。

 

    不過,通常來說,整型主要是用以描述整數的,這種說法比較通用化,對於其他程式設計語言來說也是友善的說法。比如在java語言中,算術類型之間的轉換還是必須嚴格的按照強制轉型進行的。

     整型(除bool類型外)可以分為帶符號signed和無符號unsigned類型。帶符號類型signed可以表示正負數、0,而無符號數則只能表示0和正數。預設情況下是帶符號數的,例如 int i;相當於signed int i; 而要定義無符號數必須顯示在前面加上unsigned加以說明,例如,unsigned int i。然而,對於char類型,char類型可以有三種類型:普通char、signed char和unsigned char,即便如此,char類型只有兩種表示方式,即signed char和unsigned char。

    帶符號數與無符號數的區別在於,帶符號數使用資料中的最高位作為符號位,剩餘的坐資料位元,而無符號數則使用全部的位bit作為資料位元。假設以8位為例,則無符號資料使用全部的8位來表示資料,則資料的表示範圍從0—255。而帶符號使用最高位(第7位,從0位開始算)為符號位,該位若是1則表示負數,若是0表示正數,剩下的7位用來表示資料,則資料表示範圍從-128—127。

    整型是有表示範圍的,那麼如果在整型賦值時超過了類型所表示的範圍,會有什麼發生呢?

那麼我們來看看以下幾個程式。(條件:實驗機器是32位)

第一題:

short i = (short)65535;
 printf("%d\n",i);

程式輸出的是:-1.

第二題:

short i = (short)65538;
 printf("%d\n",i);

程式輸出的是:2.

第三題:

 short i = (short)-32769;
 printf("%d\n",i);

程式輸出的是:32767

為什麼這樣?為什麼輸出的不是我們賦予的預期值?

當然,這是賦予的值超出了資料的表示範圍導致的。那麼,為什麼得到這樣的值?

現在我們針對第一題,首先我們將65535十六進位表示為0xffff,轉化為二進位是11111111 11111111剛好是16位,short類型是半個機器字長,因此為16位。由於此時i被定義為帶符號數,最高位(第15位為1,負數),0xffff則正是-1的在機器中的補碼。所以,輸出剛好是-1。如果程式改為:

unsigned short i = (short)65535;
 printf("%d\n",i);

則輸出正好是65535;

針對第二題,變數i同樣定義為帶符號,首先將65538轉換為二進位,則為1 00000000 00000010是17位二進位,由於short類型只有16位,因此,只截取出後16位00000000 00000010,可見,結果正式帶符號數+2。那麼,如果把i定義為無符號數,或輸出什麼呢?還會是+2嗎?同樣的道理,17位二進位中,只照截取00000000 00000010部分,而無符號數只是把最高位算進資料位元中,固然,00000000 00000010整體還是2。

針對第三題,首先我們將-32769用二進位補碼錶示為1 01111111 11111111是17位,因此,截取後16位01111111 11111111,而後16位的帶符號數就是+32767。這就是為什麼會得到這樣的一些結果了。

偶然複習到C++的整型,結合一些自身經驗,再看C/C++整型罷,歡迎指正! 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.