數據類型和存儲

數據類型和存儲

浮點數據類型

在C和C++中的浮點分爲floatdouble

這2個浮點類型的區別在於寬度,在存儲方式上沒有區別。

首先需要說明一點二進制是沒辦法表示負數的,所以負數的二進制表示有各種規範

C和C++採用的是IEEE標準,下面用一個float的例子來說明吧

  1. 先將這個實數的絕對值化爲二進制格式

  2. 將這個二進制格式實數的小數點左移或右移n位,直到小數點移動到第一個有效數字的右邊。

  3. 從小數點右邊第一位開始數出二十三位數字放入第22到第0位。

  4. 如果實數是正的,則在第31位放入“0”,否則放入“1”。

  5. 如果n 是左移得到的,說明指數是正的,第30位放入“1”。如果n是右移得到的或n=0,則第30位放入“0”。

  6. 如果n是左移得到的(也就是得到的指數),則將n減去1後化爲二進制,並在左邊加“0”補足七位,放入第29到第23位。

float i = 1.25;

首先把i轉換成浮點數的二進制,首先整數部分就是0001,小數部分則是0.252=0.500.25*2=0.5···0,0.52=110.5*2=1···1。取商的整數部分,然後順序排列01。那麼這個二進制就表示出來了是1.01。

符號位(31) 指數部分(30-23)8位 尾數部分(22-0)23位
正數0,負數1 根據第5條n=0,30位爲0
第6條指數n=0,減去1是-1
轉爲2進制11111111,取後7位
存儲小數點後的位數,不夠23位補0
0 0(30)1111111(29-23) 01000000000000000000000(22-0)

得到了這一串二進制數就是i在電腦中存儲的樣子了,在彙編中會被轉成16進制便於查看。

double跟float的區別只是更加精確而已,存儲是一樣的,就是補的位數更多了而已。至於不會把10進制負數轉成2進制的可以看看這個回答十進制負數怎麼轉化爲二進制

PS

指數部分網上大多數是這樣說的,float類型是元數據+127(1111111)後轉成2進制,double類型則是元數據+1023(1111111111)後轉成2進制。不管哪種說法結果都是一樣的.

ASCII

  1. ASCII 碼使用指定的 7 位或 8 位二進制數組合來表示 128 或 256 種可能的字符。

  2. 標準 ASCII 碼使用 7 位二進制數來表示所有的大寫和小寫字母,數字 0 到 9、標點符號,以及在美式英語中使用的特殊控制字符。

  3. 擴展 ASCII 碼允許將每個字符的第 8 位用於確定附加的 128 個特殊符號字符、外來語字母和圖形符號。

標準ASCII碼可參見百度百科

漢字編碼標準也在其中有介紹

一個關於數據存儲的小例子

#include<stdio.h>
int main()
{
    int i = 'a';//mov dword ptr [i],61h
    float m = 1.2;//mov dword ptr [m],1
    printf("%c\n", i);
    printf("%d\n", i);
}
/*OutPut
a
97
*/

在初學C的時候,我想大多數都是說int是整型,short是短整型,char是字符型,floatdouble是浮點型。通過這個例子我想其實很清楚了。int i = ‘a’ 這個代碼應該足夠讓你感到驚訝了。除了浮點型,不論是intshortchar的區別只是寬度而已,也就是一千個讀者有一千個哈姆雷特,究竟是整數還是字符,取決於你。浮點的存儲跟整型不一樣所以不能一概而論。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章