C 查缺補漏之變數和基本型別

2021-06-28 03:11:09 字數 2604 閱讀 1193

1.塊處理儲存

一般來說計算機以位序列儲存資料,每一位儲存0或1,一段記憶體可能儲存著0001010010101010...但是這樣的儲存是沒有任何意義的,讓儲存器具有結構的方法是塊處理儲存,那麼什麼是快處理儲存呢,就是用2^n表示乙個儲存塊的位數(一般以8位作為乙個塊),這樣操作起來更加方便。

如下圖:

123456

01110001

123457

10101001

123458

10100100

要操作乙個塊,需要什麼東西呢?那就是所謂的位址,上面的123456就是這個塊的位址,也相當於它的標示符,但是要讓位址為123456的這個位元組具有意義,那麼還需要儲存在該位址的值的型別,一旦知道了該位址的型別,那麼就知道表示該型別需要多少位和如何解釋這些位。

比如123456這個塊如果是整形型別的(當然int需要占用四個位元組)那麼表示的就是112,如果表示的是iso-latin-1的乙個字元,那麼就表示小寫字母q

下面來看乙個例子:

#include #include #include using namespace std;

int main(int argc, char const *argv)

{ unsigned int number = 16843009;//二進位制為00000001000000010000000100000001

unsigned int * pnumber = &number;

cout

cout

觀察之前我們的那個整形number,不正是由四塊值為00000001組成的麼,只是解釋為unsigned int 型別時為16843009,解釋為unsigned char 型別時為1.

2.除了bool型別的整形才可以是unsigned 或者是signed ,如果在只寫unsigned 不加上具體型別,那麼就是unsigned int型別的 。

3.特殊的char型別

與其他整形不同,char型別有三種不同的型別:char , unsigned char , signed char。但是只有兩種表示形式unsigned char 或者signed char。這句話是什麼意思呢?我們知道(int,short,long)型別預設都是signed型別的,但是char型別時沒有預設型別的,具體是signed還是unsigned型別,還要由編譯器而定。要想確定編譯器預設是signed還是unsigned,可以

char ch =-1;

printf("%d\n",ch);

如果列印的是-1,那麼表明是signed型別的

若是255,那麼表明是unsigned型別的

我在gcc上面測試以後發現是signed型別的,所以在編寫char型別的時候最好還是加上signed或者unsigned吧,不然又會多了一些莫名奇妙的錯誤。

4.浮點型

都知道float表示的浮點型使用乙個字來表示,且精度是單精度,只有6位有效數字

double型別占用兩個位元組,精度為雙精度,至少保證了10位的精度

這裡的精度到底是什麼意思呢?我們來看一下float和double內部到底是如何儲存的:

型別float大小為4位元組,即32位,記憶體中的儲存方式如下:

符號位(1 bit)

指數(8 bit)

尾數(23 bit)

型別double大小為8位元組,即64位,記憶體布局如下:

符號位(1bit)

指數(11 bit)

尾數(52 bit)

對於float型別來書8位的指數取值範圍為:-2^7~2^7+1(-127~128)

double型別11位指數取值範圍為-2^10~2^10+1(-1024~1025)

指數的含義是什麼呢?

float的範圍為-2^128 ~ +2^128,也即-3.40e+38 ~ +3.40e+38;double的範圍為-2^1024 ~ +2^1024,也即-1.79e+308 ~ +1.79e+308

接著我們來看一下尾數:

所以所謂的精度就是這裡的尾數所能表示的數的長度

下面我們來看乙個例子:

#include #include #include using namespace std;

int main(int argc, char const *argv)

{ float f1 = 1.123456789123456789;

double d1 = 1.123456789123456789;

cout<

我們可以明顯的看到float從第7位(為什麼不是第六位呢?因為8388608)有效數字開始就開始不準確了

double型別也就只顯示了前16位,後面的都被截斷了。所以以後再具體應用中需要辨別他們之間的區別,float的精度損失是不可忽視的,使用double型別基本上是不會出錯的,雙精度的計算代價相對於單精度樂意忽略,在某些機器上double型別比float型別要快得多(可能是硬體上做了優化了吧)。但是long double一般來說是沒有必要的。。。

最後說一點,上面我們看到了浮點型別的結構,裡面有一位固定符號位,所以浮點型別是沒有unsigned的!!!

C 查缺補漏之變數

我們在日常程式設計中經常會有int a 10 那麼 這個a就是變數。變數提供了程式可以操作的有名字的儲存區,要是在彙編時代,我們是直接操作暫存器和記憶體位址的,那麼現在就把底層的暫存器和記憶體位址抽象出來,取了乙個別名,通過這個別名也可以操作這塊記憶體。c 中每乙個兩邊都要有乙個特定的型別,該型別決...

C 習題之變數和基本型別

習題主要選自c primer,方便自己以後複習才寫到部落格上 1.當給16位的unsigned short物件賦值100000的時候,最終賦值結果是?解 首先了解超出變數範圍的時候,編譯器的處理策略是二進位制擷取低16位 unsigned short的取最大值2 16 1 65535,那麼大於16位...

c primer之變數與基本型別

如果表示式裡既有帶符號型別又有無符號型別,當帶符號型別取值為負時會出現異常結果。因為帶符號數會自動轉換成無符號數。unsigned u 10 int i 42 std cout endl 輸出 84 std cout endl 如果int佔32位,輸出4294967264引用與指標 引用並非物件,引...