第二章 變量和基本類型——2.1 基本內置類型


2.1 基本內置類型


閑話少敘,先把基本的內置類型列舉出來:

類型 含義 最小存儲空間 整型/浮點型
bool 布爾型 —— 整型
char 字符型 8位 整型
wchar_t 寬字符型 16位 整型
short 短整型 16位 整型
int 整型 16位 整型
long 長整型 32位 整型
float 單精度浮點型 6位有效數字 浮點型
double 雙精度浮點型 10位有效數字 浮點型
long double 擴展精度浮點型 10位有效數字 浮點型

Tips:

  • 雖然C++標准規定了每一種算數類型的最小存儲空間,但並不能組織編譯器使用更大的存儲空間。以int為例,幾乎所有的編譯器使用的存儲空間都比16位要大。

  • 8位的塊為一個字節32位4個字節為一個“字”。只有在知道相應內存地址對應的字節或字所表示的算術類型后,才能確定其真正表示的含義。例如:內存地址為736425的字節01110001,如果我們知道其算術類型為8位無符號整數,那么其代表了整數112;若其代表了ISO-Latin-1中的一個字符,那么其代表了小寫字母q

  • bool以外,其他整型類型均可分為signed(帶符號的)和unsigned(不帶符號的)。intshortlong默認為signed; 為使用unsigned類型必須先聲明,如unsigned longunsigned int可簡化表示為unsigned

  • 對於整型賦值這件事來說,當聲明的數據類型為unsigned的時候,需要對超出范圍的(如336)和負數的值(如-1)取模,在進行賦值。首先,針對8位unsigned char, 那么336%256 = 1 * 256 + 8080為最終的模數;而對於-1 % 256 = -1 * 256 + 255,則255為最終的模數。

Postscript:

可能你也會跟我一樣,被上面的求模給折騰個夠嗆。經過一番搜索與探尋,我們從原理上來探究一下這個問題。

首先,我們先來看看C++中在內存里是通過什么形式來存儲數據的。這里我們拋出三個概念:原碼、反碼、補碼。《第二章 變量和基本類型——2.1 基本內置類型((轉)附錄之原碼、反碼和補碼及其背后的數學之美)》

  • 原碼 簡單來說就是真真正正表示具體數值的碼,最高位為符號位,其余各位表示二進制數值。如1表示為0000 0001; -3表示為1000 0011。用原碼是沒法直接來解決上述正數加負數問題的,所以偉大的計算機科學家們就開動了腦筋,創造了反碼和補碼這一神器的東西。

  • 反碼 為了簡化計算機的運算方式,用加法替代減法(1-1 = 1+(-1) = 0),所以出現了反碼。反碼的概念是通過求模同余思想發展而來的。通過求反如5表示為0000 0101(正數的反碼為本身); -3表示為1111 1100(負數的反碼為除去符號位求反),使用反碼進行相加得到的反碼為0000 0001, 注意①,這里出現了進位,需要在求得反碼和的基礎上加上進位1,從而求得最終的反碼0000 0010注意②,針對得到的最終反碼和,還需要恢復成原碼才能正確表示其真值,對於上述結果0000 0010,首位為0,其為正數,則反碼與原碼相同;若首位為1,則要將其余各位取反,方可得到最終正確的原碼。

  • 補碼 顧名思義,就是要補一下反碼的缺陷吧,我是這么覺得的,不過更深層的數學解釋是將模增加1!這背后偉大的數學原理還請大家詳見本節補充內容之《第二章 變量和基本類型——2.1 基本內置類型((轉)附錄之原碼、反碼和補碼及其背后的數學之美)》。使用補碼進行求和,正數的補碼為本身,負數的補碼需先將原碼轉換成反碼在加15的補碼表示為0000 0101; -3的補碼表示為1111 1101,使用補碼進行相加得到的補碼和為0000 0010, 注意,針對得到的最終補碼和,還需要恢復成原碼才能正確表示其真值,對於上述結果0000 0010,首位為0,其為正數,則反碼與原碼相同;若首位為1,則要將其余各位取反,方可得到最終正確的原碼。

通過以上的闡述我們明白了在計算機的內存中到底是以什么形式存儲數據的,沒錯,就是補碼 。那我們知道-1的補碼為1111 1111,所以當我們將-1賦值給unsigned變量時,左手邊第一位符號位變成了數字位,所以最終的結果將會變成255

綜上所述,當把超出范圍的數值(正數或者負數)賦給unsigned變量時,編譯器會調整越界值使其滿足要求,編譯器會自動將該值對unsigned類型的取值數目進行求模,然后取所得值;當把超出范圍的數值(正數或者負數)賦給signed變量時,也不會報錯,但是最后的取值卻與編譯器有關,不同的編譯器可能會采取不同的處理方法,但是大多數的編譯器依然是采取和unsigned類型一樣的處理方法,也就是對該類型的取值數目求模后的值。但是這中做法不能得到保證。具體的示例可以參考《第二章 變量和基本類型——2.1 基本內置類型((轉)附錄之C++中整型的超范圍賦值問題)》


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com