為什麼這篇c資料型態大小鄉民發文收入到精華區:因為在c資料型態大小這個討論話題中,有許多相關的文章在討論,這篇最有參考價值!作者sb0917 (QQ)看板NTUBIME101HW標題[C++] 變數型態簡述時間Sun Oct...
因為教授上課好像沒仔細提到
所以在這裡提一下
大家常用到的變數有int,float,double,char
這篇先撇開char不講
int 整數 4byte
float 單精度浮點數 4byte
double 倍精度浮點數 8byte
1byte = 8bit
1bit可以表示一個0 or 1
------
簡略二進位
一個二進位資料:1001
從最右邊開始依序為2^0,2^1,2^2....
這是一個byte:
128 64 32 16 8 4 2 1
┌─┬─┬─┬─┬─┬─┬─┬─┐
│ 0│ 0│ 0│ 0│ 1│ 0│ 0│ 1│
└─┴─┴─┴─┴─┴─┴─┴─┘
所以1001 = 1x2^0 + 0x2^1 + 0x2^2 + 1x2^3 = 9
------
int 整數型態
int有4byte意即有32bit
而最左邊的的那個bit是拿來表示符號的
即0為正數 1為負數
至於負數的運算要牽涉到補數 這就不提了
而後面剩下那31bit才是拿來表示數字用的
故int正數最大只能表示至2^31
這時候會有人說那加unsigned就好啦
這裡有個概念很重要
unsigned,long,short這些東西不是資料型態
他們叫作「修飾字」,是用來表述他們所修飾的變數的
所以unsigned int意思就是
「把前方那個表示符號的位元取消」
所以他才能表示正數到2^32 他並非讓int變兩倍,而只是平移整個範圍而已
long才是變兩倍 不過事實上好像long long int才是8byte(64bit)...
long int跟int好像一樣大的樣子...(in ANSI C / C++)
------
float 單精度浮點數型態
float有4byte 很多第一次看到的人會嚇到
為什麼跟int一樣的大小,但是卻能表示出比int還大出許多的數值
原因是他利用bit的規則不一樣
同樣的最左邊那個bit是拿來表示正負號
但是接著那個bit後方的位元不是全部都拿來表示數字
|--1--|-------8--------|-----------------23-------------------|
正負 10^x 數字部分
他是這樣表示的
所以他精度只有2^23 = 8388608 意思就是他能表示準確的數字只有七位
所以雖然他能表示比int大的數字
但是一點也不準確
而為何pi還是可以算到小數第十六位?
因為這是ANSI C/C++規定的
-------
double 倍精度浮點數
跟Float一樣,只是大小變兩倍,規則就不用說了
他能表示2^52 = 4503599627370496 精準值十六位
特別要說的是long double
他是12byte
照理說他應該可以突破十六位的值
但為什麼當初印pi卻到十六位就停了呢?
一樣 因為這是規定 小數運算就只能到十六位
--------
以上是一些基本的計算機概論
如果有興趣的同學可以自己找書翻翻
希望這些對大家有幫助
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 125.232.105.20
※ 編輯: sb0917 來自: 125.232.105.20 (10/26 20:05)