0.333屬于什麼數據類型?前面幾章講了分支、循環和函數幾種基本結構本章主要講解數據類型及表達式本節介紹數據類型的概念和幾種簡單數據類型的存儲格式、取值範圍和精度,并通過實例對整數的“反卷”特性進行解讀,對浮點數的“不精确表示”特性進行分析,我來為大家講解一下關于0.333屬于什麼數據類型?跟着小編一起來看一看吧!
前面幾章講了分支、循環和函數幾種基本結構。本章主要講解數據類型及表達式。本節介紹數據類型的概念和幾種簡單數據類型的存儲格式、取值範圍和精度,并通過實例對整數的“反卷”特性進行解讀,對浮點數的“不精确表示”特性進行分析。
程序設計的目的是為了解決現實問題,程序設計處理的對象是數據。因此數據的采集、表達和存儲是程序設計前要先解決的問題。數據是觀察和測量的結果,有些要用整數表示,如年、月、日,但是大部分要用實數表示。數據有定量描述和定性描述兩類,測量的結果用數值定量描述,有些觀察結果隻能定性描述,如描述一個人“冷靜、客觀和幽默”等,這些數據分别稱為數值型和非數值型數據。
無論如何,采集的數據在計算機内部全部采有用二進制表示,因此,要存儲采集到的數值型數據和非數值型數據都要預先經過編碼——即以某種形式變成二進制,才能存到計算機内部。數據類型就是對不同類别的數據的抽象,反映了數據的編碼格式、存儲的長度及可以參與的運算。C語言預先提供字符型、整型、長整型、單精度浮點型和雙精度浮點型等五類簡單類型。程序員也可以把這些類型按一定方式任意組合而構造自己需要的類型——自定義類型。
實際上C語言所有簡單類型都是數值型,因為字符型數據被看成了隻有8比特的最短整型。這樣整型數就有了8位的整型char、16位的整型short或short int、32的整型long或int、64位的整型long long等四類。前面我們已經介紹了整型是按照補碼存放的,目的是為了把減法運算變成加法運算。正數的補碼與原碼一樣。所謂原碼就是整數直接轉換成的二進制,反碼就是對原碼除了符号位以外的每個二進制位進行取反運算——0變1或1變0,反碼加1得到補碼。如短整型65的原碼、反碼和補碼都是二進制0000000001000001,但是短整型-65的原碼是1000000001000001,反碼為1111111110111110,補碼為1111111110111111。從右至左開始數,每四個二進制對應一個十六進制位,因此-65對應的16進制補碼為0xffbf,其中0x表示16進制的前綴。
整數又可分為有符号整數和無符号整數,分别用signed和unsigned來表示。當整數為有符号數時,整數對應的二進制最高(最左)位用來表示符号,為1表示負數,為0表示正數,因此n位二制制數的有符号整數的取值範圍是至,如有符号字符型數據取值範圍為-128至127,有符号短整型取值範圍在-32768至32767之間;當整數為無符号數時,所有位都用來表示數值,取值範圍在0至,如無符号字符取值範圍在0至255之間,無符号短整型取值在0至65535之間。
C語言中實數用浮點類型表示,分為單精度浮點型float、雙精度浮點型double和長雙精度浮點型long double實現三種,分别占用存儲空間為4字節、8字節和10字節(長度根據編譯不同而不同)。浮點型數據不分有符号數和無符号數,而是按照IEEE 754标準保存數據,即:符号位、指數部分、尾數三個部分。所有浮點數符号位隻占1位。float型數據的指數部份為8位,尾數部分為23位;double型數據的指數部份為11位,尾數部分為52位。所以,float數據的取值範圍在至之間,double型數據的取值範圍為)至之間。float型數據的精度為7位,double型數據精度為16位。
搞清楚整數的取值範圍和浮點數的精度對于程序設計是非常重要的,如以下程序:
#include <stdio.h>
int main( )
{
short int a=32767;
a=a 1;
printf("%d",a);
return 0;
}
運行後會是什麼結果呢?我們會想當然認為32767 1後結果是32768,但是顯示的卻是-32768。為什麼呢?這是因為短整型數據隻有16比特。32767對應的二進制為0111111111111111,加上1後,變成了1000000000000000。最高位變成了1,即此數變成了負數,此數是多少呢?
先看一下-32767的原碼、反碼和補碼:
原碼是1111111111111111
反碼是1000000000000000
補碼是1000000000000001
再來看一下-1的原碼、反碼和補碼:
原碼是1000000000000001
反碼是1111111111111110
補碼是1111111111111111
所以
-32768==
=
=
=
=
=
即對應的數為-32768、對應的無符号整數為32768。即無符号整數32768有符号整數-32768是同一個數。
我們把上述情況稱為整數“反卷”,這是由計算機内規定整數位數(如短整型為16位)決定的。當然,如果我們讓-32768再減1,結果也會“反卷”到最大值32767,大家可以手算一下。
因為“反卷”,所以以下程序的循環會是死循環嗎?
#include <stdio.h>
int main( )
{
short int a=1;
while(a>0){
printf("%d\n",a);
a=a 1;
}
return 0;
}
程序中,a的初值為1,然後每執行一次循環a的值就加1。看起來a是一直是大于0的數,但是事實是當a=32767并輸出後,a再加1變成了-32768,此時循環條件不滿足,循環就束了。
除了“反卷”外,整數的取值範圍也是要注意的問題,如想保存n!。短整型最多可以保存7!,短整型計算8!顯示結果是一個負數。我們可以改用長整型long保存階乘,但能保存的最大階乘隻是16!。還可以用long long來保存階乘,此時可以保存的最大階乘也隻是20!。如果要保存更大的階乘,可以使用雙精度浮點型double來保存。
浮點數的取值範圍雖然很大,但是精度卻是有限的。如以下程序說明float與double的精度情況:
#include <stdio.h>
int main( )
{
float a;
double b;
a=123456789;
b=123456789012345678;
printf("a=%.0f,b=%.0lf\n",a,b);
return 0;
}
程序的輸出結果是:
a=123456792,b=123456789012345680
可以看到a的值隻有前7位是正确的,第8位進行四舍五入,第9位是一個拉圾數據;b的值前16位是正确的,第17位進行四舍五入,第18位是一個拉圾數據。可見,浮點數表示數的範圍雖然很大,但是精度并不高。
浮點數還有一個緻命的弱點,即不能精确表示小數,即使保存0.1也是有誤差的。我們來猜一下以下程序段顯示什麼?
#include <stdio.h>
int main( )
{
float b;
b=0.1;
if(b==0.1)
printf("b==0.1");
else
printf("b!=0.1");
return 0;
}
根據我們的經驗,b是0.1,所以if語句的條件表達式b==0.1為真,所以應該顯示“b==0.1”。但是運行結果卻與我們預想的不同,顯示的是“b!=0”.1。為什麼呢?看以下程序:
#include <stdio.h>
int main( )
{
float b;
b=0.1;
printf("%.10f\n",b);
printf("%.10f\n",0.1);
return 0;
}
程序執行後顯示結果為:
0.1000000015
0.1000000000
原來常量0.1是雙精度浮點數,b是單精度浮點數。在比較時b要轉換成雙精度浮點數,因此才有b與0.1不等的情況。所以浮點數的比較可采用兩個浮點數相減的絕對值與某個很小的正小數比較,如果小于可以認為兩者相等。如:
fabs(b - 0.1)<1e-6
可以用來表示b與0.1是否相等。
本節介紹了數據類型的概念及幾種簡單類型的存儲格式,講解了整數的“反卷”特性及浮點數的相等比較操作。這些都會對正确理解和編寫程序起到非常重要的作用。本節就講到這裡,下次再見!
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!