c語言的數據不同類型
不同類型的數據在内存中占用的存儲單元長度是不同的,例如, Visual C +為 char (字符型)數據分配1個字節,對int 型(基本整型)數據分配4個字節,存儲不同類型數據方法也是不同的。
(一)整型數據
1整型數據的分類
(1)基本整型( int 型)
編譯系統分配給 int 型數據2個字節或4個字節(由具體的 C 編譯系統自行決定)。如 Turbo C2.0為每一個整型數據分配2個字節(16位),而 Visual C 為每一個整型數據分配4個字節(32位)。
在存儲單元中的存儲方式是:用整數的補碼形式存放。一個正數的補碼是此數的二進制形式本身,補全2個字節16位碼,如5的二進制形式是101,如果用兩個字節存放一個整數,則在存儲單元中數據形式是00000000-00000101;如果是一個負數,應先求出負數的補碼。負數的補碼的方法是:先将此數的絕對值寫成二進制形式,然後對其所有二進位按位取反,再加1。
如-5的補碼:
5的補全2個字節原碼00000000-00000101
5的原碼按位取反
11111111-11111010,再加1
-5的補碼為11111111-11111011
在存放整數的存儲單元中,最左面一位是用來表示數的正負符号的。如果該位為0表示數值為正;如果該位為1,表示數值為負。
如果給整型變量分配2個字節,則存儲單元中能存放的最大值為01111111-11111111,第1位為0代表正數,後面15位為全1,此數值是(2^15-1),即十進制數32767。最小值為10000000-00000000,此數是-2^15,即-32768。因此2個字節的一個整型變量的值的範圍是-32768~32767。超過此範圍,就出現數值的“溢出”,輸出的結果顯然不正确。
(2)短整型( short int )
類型名為 short int 或 short 。如用 Visual C ,編譯系統分配給 int 數據4個字節,短整型2個字節。存儲方式與 int 型相同。一個短整型變量的值的範圍是﹣32768~32767。
(3)長整型( long int )
類型名為 long int 或 long 。 Visual C +對一個 long 型數據分配4個字節(即32位),因此 long int 型變量的值的範圍是﹣2^31~(2^31-1),即-2147483648~2147483647。
(4)雙長整型( long long int )
類型名為 long long int 或 long long ,一般分配8個字節。 C 标準隻要求 long 型數據長度不短于 int 型, short 型不長于 int 型。即 sizeof ( short )≤ sizeof ( int )≤ sizeof(long )≤ sizeof ( long long ),
sizeof 是測量類型或變量長度的運算符。在 Turbo C2.0中, int 型和 short 型數據都是2個字節(16位),而 long 型數據是4個宇節(32位)。通常的做法是:把 long 定為32位,把 short 定為16位,而 int 可以是16位,也可以是32位,由編譯系統決定。
在将一個程序從 A 系統移到 B 系統時,需要注意這個區别。例如:在 A 系統,整型數據占4個宇節,程序中将整數50000賦給整型變量 price 是合法的,可行的。但在 B 系統,整型數據占2個字節,将整數50000賦給整型變量 (範圍-32768~32767),超過整型數據的範圍,出現“溢出”。這時應當把 int 型變量改為 long 型,才能得到正确的結果。
2.整型變量的符号屬性
變量值在存儲單元中都是以補碼形式存儲的,存儲單元中的第1個二進位制代表符号。整型變量的值的範圍包括負數到正數。
整型數據常見的存儲空間和值的範圍( Visual C +的安排)
類型 /字節數 /取值範圍
int (基本整型)/4字節/
-2147483648~2147483647,即-2^31~(2^31-1)
unsigned int (無符号基本整型)4字節/即0~(2^31-1)
short(短整型)2字節,-32768~32767,即-2^15~(2^15-1)
unsigned short (無符号短整型)2個字節,0~65535,即0~(2^16-1)
long (長整型)4字節,
-2147483648~2147483647,即-2^31~(2^31-1)
unsigned long (無符号長整型)4字節,0~4294967295,即0~(2^32-1)
long long (雙長型)8字節,
-9223372036854775808~9223372036854775807,即﹣2^63~(2^63-1)
unsigned long long (無符号雙長整型),8字節
0~18446744073709551615,即0~(2^64-1)
在實際應用中,有的數據的範圍常常隻有正值(如庫存量等)。為了允分利用變量的值的範圍,可以将變量定義為“無符号”類型。可以在類型符号前面加上修飾符unsigned ,表示指定該變量是“無符号整數”類型。如果加上修飾符 signed ,則是“有符号類型”。因此,在以上4種整型數據的基礎上可以擴展為以下8種整型數據:
有符号基本整型[ signed ] int ]
無符号基本整型unsigned int
有符号短整型[ signed ] short [ int ]
無符号短整型unsigned short [ int ]
有符号長整型[ signed ] long [ int ]
無符号長整型unsigned long [ int ]
有符号雙長整型[ signed ] long long [ int ]
無符号雙長整型unsigned long long [ int ]
方括号表示其中的内容是可選的,既可以有,也可以沒有。如果既未指定為 signed 也未指定為 unsigned 的,默認為“有符号類型”。如 signed int a 和 int a 等價。
有符号整型數據存儲單元中最高位代表數值的符号(0為正,1為負)。如果指定 unsigned (為無符号)型,存儲單元中全部二進位( b )都用作存放數值本身,而沒有符号。無符号型變量隻能存放不帶符号的整數,如123,而不能存放負數。如-123。由于左面最高位不再用來表示符号,而用來表示數值,因此無符号整型變量中可以存放的正數的範圍比一般整型變量中正數的範圍擴大一倍。如果在程序中定義 a 和 b 兩個短整型變量(占2個字節),其中 b 為無符号短整型
short a ;// a 為有符号短整型變量
unsigned short b ;// b 為無符号短整型變量
則變量 a 的數值範圍為-32768~32767,而變量 b 的數值範圍為0~65535。
(1)隻有整型(包括字符型)數據可以加 signed 或 unsigned 修飾符,實型數據不能加。
(2)對無符号整型數據用“% u ”格式輸出。% u 表示用無符号十進制數的格式輸出。如: unsigned short price =50;//定義 price 為無符号短整型變量。printf ("% u \", price );//指定用無符号十進制數的格式輸出
在将一個變量定義為無符号整型後,不應向它賦予一個負值,否則會得到錯誤的結果。如:unsigned short price=-1;//不能把一個負整數存儲在無符号變量中。
printf ("% d \", price ),得到結果為65535。顯然與原意不符。
原因是:系統對-1先轉換成補碼形式,就是全部二進位都是1,然後把它存入變量 price 中。由于 price 是無符号短整型變量,按其左面第一位不代表符号,按“% d ”格式輸出,就是65535。
(二)字符型數據
由于字符是按其代碼(整數)形式存儲的。
1字符與字符代碼
字符與字符代碼并不是任意寫一個字符,程序都能識别的。例如代表圓周率的丌在程序中是不能識别的,隻能使用系統的字符集中的字符,目前大多數系統采用 ASCII 字符集各種字符集(包括 ASCII 字符集)的基本集都包括了127個字符。其中包括:
字母:大寫英文字母 A ~ Z ,小寫英文字母 a ~ Z 。
數字:0~9。
專門符号:29個,包括
!"# &'( ) * 十,一,/ : ; く= >? [ ] _ (丨) ~
空格符:空格、水平制表符、垂直制表符、換行、換頁。
不能顯示的字符:空( null )字符(以'\0'表示)、警告(以'\ a '表示)、退格(以'\ b' 示)、回車(以 '\r '表示)等。
字符是以整數形式(字符的 ASCII 代碼)存放在内存單元中的。如:
小寫字母'a ’的 ASCII 代碼是十進制數97,二進制形式為1100001。
轉義字符’ \n '的 ASCII 代碼是十進制數10,二進制形式為0001010。
以上字符的 ASCII 代碼最多用7個二進位就可以表示。所有127個字符可以用7個二進位表示,當Ascii代碼為127時,為1111111,所以在c語言中,指定用一個字節(8位)存儲一個字符(所有系統都不例外)。此時,字節中的第1位置為0。如小寫字母’ a 在内存中的存儲二進制數為01100001,因為' a ’ASCI1代碼是十進制數97。
注意:宇符’1'和整數1是不同的概念。字符'1'隻是代表一個形狀為‘1'的符号,在需要時按原樣輸出,在内存中以 ASCII 碼形式存儲,占用1個字節,而整數1是以整數存儲方式(二進制補碼方式)存儲的,占2個或4個字節。整數運算1十1等于整數2,而字符'1' '1'并不等于整數2或字符'2'。
2字符變量
字符變量是用類型符 char 定義字符變量。
如:char e ='?';
定義e為字符型變量并使初值為字符’?’。?的 ASCII 代碼是63,系統把整數63賦給變量 e 。e是字符變量,實質上是一個字節的整型變量,由于它常用來存放字符,所以稱為字符變量。可以把0~127之間的整數賦給一個字符變量。在輸出字符變量的值時,可以選擇以十進制整數形式輸出,或以字符形式輸出。如: printf ("% d % c \ n ", e , e),輸出結果是63 ?。用“% d ”格式輸出十進制整數63,用“% c ”格式輸出字符'?'。
整型變量可以用 signed 和 unsigned 修飾符表示符号屬性。字符類型也屬于整型,也可以用 signed 和 unsigned 修飾符。
字符型數據的存儲空間和值的範圍
類 型/字節數/取值範圍
signed char (有符号字符型)1字節,-128~127,即-2^8~(2^8-1)
unsigned char (無符号字符型)1字節,0~2^8-1,在使用有符号字符型變量時,允許存儲的值為-128~127,但字符的代碼不可能為負值,所以在存儲字符時實際上隻用到0~127這一部分,其第一位均為0。
(三)浮點型數據
浮點型數據是用來表示具有小數點的實數的。
在 C 語言中,實數是以指數形式存放在存儲單元中的。一個實數表示為指數可以有不止一種形式,如3.14159可以表示為3.14159×10^0;0.0314159×10^2,314.159X10^(﹣2)等,它們代表同一個值。可以看到:小數點的位置是可以在314159幾個數字之間、之前或之後(加0)浮動的,隻要在小數點位置浮動的同時就改變指數的值,可以保證它的值不會改變。由于小數點位置可以浮動,所以實數的指數形式稱為浮點數。
浮點數類型包括 float (單精度浮點型)、 double (雙精度浮點型)、 long double(長雙精度浮點型。
浮點數轉換為二進制存儲
單精度float類型使用32比特存儲,其中1位表示符号,8位表示指數,23位表示尾數;雙精度double類型使用64比特存儲,1位符号位,11位指數位,52位尾數位。
尾數:M是一個二進制小數,因為是二進制,所以科學計數法中這個值範圍是:1≤M。對有效數字M和指數E,還有一些特别規定。1≤M<2,也就是說,M可以寫成1.xxxxxx的形式,其中xxxxxx表示小數部分。在計算機内部保存 M時,默認這個數的第一位總是1,因此可以被舍去,隻保存後面的xxxxxx部分。比如保存1.01B的時候,隻保存01B,等到讀取的時候,再把第一位的1加上去。
1将“二進制的浮點數”轉換浮點數:
指數為0111 1100B,對應的十進制數124,則二進制指數為124-127=-3,尾數為0.01B,則M=1.01B
浮點數值為
1.01B*[2(-3)]=0.00101B=1/8 1/32=0.15625
2單精度浮點數轉換為二進制存儲:
十進制數78.375=78 0.375
整數十進制數78=100 1110B
小數十進制數0.375=3/8=1/4 1/8=2^(-2) 2^(-3)=0.011B
十進制數78.375=1001110B 0.011B=100 1110.011B=1.001110011B*(2^6)
十進制數78.375在計算機中以二進制存儲,
指數為6,則6 127=133=1000 0101B,
尾數為0.001110011B
因此符号為0,指數8位為1000 0101B,尾數23位為00111001100,0000,0000,0000;
單精度浮點數0.5轉化二進制數
十進制數0.5=0B 0.1B=0.1B=1.0B*[2^(-1)]小數十進制數0.5=1/2=2^(-1)=0.1B,十進制數0.5在計算機中以二進制存儲,其指數為-1,則-1 127=126=0111 1110B,尾數為0.0B,因此符号為0,指數8位為0111 1110B,尾數23位為000,0000,0000,0000,0000,0000;
3雙精度浮點數轉換為二進制存儲:double類型使用64比特存儲,1位符号位,11位指數位,52位尾數位。
十進制數78.375=78 0.375,整數十進制數78=1001110B,
小數十進制數
0.375=3/8=1/4 1/8=2^(-2) 2^(-3)=0.011B
十進制數78.375=1001110B 0.011B=100 1110.011B=1.001110011B*(2^6),十進制數78.375在計算機中以二進制存儲,指數為6,則6 1023=1029=10000000101B
尾數為0.001110011B,因此符号為0,指數11位為100 0000 0101B,尾數52位為
001110011000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000;
雙精度浮點數0.5轉化二進制數
十進制數0.5=0 0. 5,整數十進制數0=0B,小數十進制數0.5=1/2=2^(-1)=0.1B,十進制數0.5=0B 0.1B=0.1B=1.0B*[2^(-1)]。十進制數0.5在計算機中以二進制存儲,其指數為-1,占11位,則-1 1023=1022=11 1111 1110B,尾數為0.0B,因此符号為0,指數11位為11 1111 1110B,尾數52位為
0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000;
單精度浮點數0.0轉化二進制數
浮點數0的尾數
M=1.000,0000,0000,0000,0000,0000B
為了表示近似等于0,就使用
1.000,0000,0000,0000,0000,0000B*[2(-127)]來表示;相當于把遠端的1移動過來,所以指數為-127。
浮點數0的指數為-127 127=00000000B,尾數為000,0000,0000,0000,0000,0000B,因此符号為0,指數8位為00000000B。
尾數23位為000,0000,0000,0000,0000,0000B。
雙精度浮點數0.0轉化二進制數
浮點數0的尾數
M=1.0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000B,
為了表示近似等于0,就使用
1.0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000B *[2(-1023)]來表示;
浮點數0的指數為-1023 1023=000,0000,0000B,
浮點數0的尾數為
0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000B,
因此符号為0,指數11位為000,0000,0000B,
尾數52位為
0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000B。
十進制整數轉換為二進制整數:采用“除2取餘,逆序排列”法。十進制小數轉換成二進制小數:采用“乘2取整,順序排列”法。
(1) float 型(單精度浮點型)。編譯系統為每一個 float 型變量分配4個字節,數值以規範化的二進制數指數形式存放在存儲單元中。在存儲時,系統将實型數據分成小數部分和指數部分兩個部分分别存放。小數部分的小數點前面的數為0。如3.14159在内存中的存放形式:數符+小數部分+指數。在計算機中是用二進制數來表示小數部分以及用2的幂次來表示指數部分的。在4個字節(32位)中,究竟用多少位來表示小數部分,多少位來表示指數部分。有的 C 語言編譯系統以24位表示小數部分(包括符号),以8位表示指數部分(包括指數的符号)。由于用二進制形式表示一個實數以及存儲單元的長度是有限的,因此不可能得到完全精确的值,隻能存儲成有限的精确度。小數部分占的位( bit )數愈多,數的有效數字愈多,精度也就愈高。指數部分占的位數愈多,則能表示的數值範圍愈大。 float 型數據能得到6位有效數字,數值範圍為-3.4X10^(-38)~3.4×10^38。
(2) double 型(雙精度浮點型)。為了擴大能表示的數值範圍,用8個字節存儲一個double 型數據,可以得到15位有效數字,數值範圍為-1.7×10^-308~1.7×10^308。為了提高運算精度,在 C 語言中進行浮點數的算術運算時,将 float 型數據都自動轉換為 double型,然後進行運算。
(3) long double 型(長雙精度)型,不同的編譯系統對 long double 型的處理方法不同, Turbo C 對 long double 型分配16個字節。而 Visual C +則對 long double 型和 double 是一樣處理,分配8個字節。
(四)确定常量的類型
在 C 語言中,不僅變量有類型,常量也有類型。在程序中出現的常量是要存放在計算機中的存儲單元中的。這就必須确定分配給它多少字節,按什麼方式存儲。例如,程序中有整數12,在 Visual C +中會分配給它4個字節,按補碼方式存儲。
确定常量的類型
從常量的表示形式即可以判定其類型。對于字符常量隻要看到由單撇号括起來的單個字符或轉義字符就可以知道它是字符常量。
對于數值常量按以下規律判斷:
整型常量:不帶小數點的數值是整型常量,但應注意其有效範圍。如在 TurboC 中,系統為整型數據分配2個字節,其表值範圍為-32768~32767,如果在程序中出現數值常量23456,系統把它作為 int 型處理,用2個字節存放。如果出現49875,由于超過32767,2個字節放不下,系統會把它作為長整型( long int )處理,分配4個字節。Visual C +中,在範圍-2147483648~2147483647的不帶小數點的數都作為 int 型,分配4個字節,在此範圍外,而又在 long long 型數的範圍内的整數,作為 long long 型處理。在一個整數末尾加大寫字母L或小寫l,表示它是長整型,例如123L。但在 Visual C +中由于對 int 和 long int 型數據都分配4個字節,因此沒有必要用 long int 型。
浮點型常量
凡以小數形式或指數形式出現的實數均是浮點型常量,在内存中都以指數形式存儲。如,10是整型常量,10.0是浮點型常量。C 編譯系統把浮點型常量都按雙精度處理,分配8個字節。
如果有float a =3.14159;在進行編譯時,對 float 變量分配4個字節,但對于浮點型常量3.14159,則按雙精度處理,分配8個字節。編譯系統會發出“警告”( warning : truncation from ' const double ' to ‘ float )。意為“把一個雙精度常量轉換為 float 型”,提醒用戶注意這種轉換可能損失精度。這樣的“警告”,一般不會影響程序運行結果的正确性,但會影響程序運行結果的精确度。
可以在常量的末尾加專用字符,強制指定常量的類型。如在3.14159後面加字母 F 或f就表示是 float 型常量,分配4個字節。如果在實型常量後面加大寫或小寫的 L ,則指定此常量為 long double 型。如:
float a =3.14159f;//把此3.14159按單精度浮點常量處理,編譯時不出現“警告”
long double a =1.23L;//把此1.23作為 long double 型處理。
數據二進制存儲
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!