1. 程式人生 > >c語言基本資料型別所佔的位數

c語言基本資料型別所佔的位數

1.C++的short、int、long和long long型別通過使用不同數目的位來儲存值,最多能夠表示4中不同的整數寬度。C++提供了一種靈活的標準,它確保了最小長度(從C語言借鑑而來),如下:
1. short 至少16位
2. int 至少與 short 一樣長
3. long 至少 32 位,且至少與 int 一樣長

4. long long 至少64位,且至少與 long 一樣長 (此型別為 C++11 新增,舊的編譯器可能不支援)

2.一般而言,short型別為半個機器字(word)長,int型別為一個機器字長,而long型別為一個或兩個機器字長(在32位機器中,long型別和int型別的字長通常是相同的),所以它們的表示範圍不同。

3.short 的最小表示範圍和 int 一樣,都是-32767 到 32767 。也就是 -(2^15 - 1)到(2^15 - 1)。其中,2^15表示 2 的 15 次方。類似地,2 的 20 次方記作2^20 ,以此類推。注意:C 語言中 2^15 並不表示 2 的 15 次方,為了書寫方便,我們姑且這麼表示。

long 的最小取值範圍是 -2147483647 到 2147483647 。也就是 -(2^31 - 1) 到 (2^31 - 1) 。unsigned short的最小表示範圍和unsigned int 一樣,都是 0 到 65535(2^16 - 1)。unsigned long 的最小取值範圍是 0 到 4294967295(2^32 - 1)。

long long的最小取值範圍是 -9223372036854775807(-(2^63 - 1))到 9223372036854775807(2^63 - 1);unsigned long long 是 0 到 18446744073709551615(2^64 - 1)。

 目前,long long 一般 64 位,long 是 32 位,short 是 16 位,而 int 或者 16 位,或者 32 位。具體某個編譯器到底使用多少位來表示這些型別。

4.float與double的範圍和精度

1. 範圍
  float和double的範圍是由指數的位數來決定的。
  float的指數位有8位,而double的指數位有11位,分佈如下:
  float:
  1bit(符號位) 8bits(指數位) 23bits(尾數位)
  double:
  1bit(符號位) 11bits(指數位) 52bits(尾數位)
  於是,float的指數範圍為-127~+128,而double的指數範圍為-1023~+1024,並且指數位是按補碼的形式來劃分的。
  其中負指數決定了浮點數所能表達的絕對值最小的非零數;而正指數決定了浮點數所能表達的絕對值最大的數,也即決定了浮點數的取值範圍。
  float的範圍為-2^128 ~ +2^128,也即-3.40E+38 ~ +3.40E+38;double的範圍為-2^1024 ~ +2^1024,也即-1.79E+308 ~ +1.79E+308。

2.  精度
  float和double的精度是由尾數的位數來決定的。浮點數在記憶體中是按科學計數法來儲存的,其整數部分始終是一個隱含著的“1”,由於它是不變的,故不能對精度造成影響。
  float:2^23 = 8388608,一共七位,這意味著最多能有7位有效數字,但絕對能保證的為6位,也即float的精度為6~7位有效數字;
  double:2^52 = 4503599627370496,一共16位,同理,double的精度為15~16位。

-----------------------------我是分割線----------------------------------------------------------

下面舉例看下4.5在計算機中儲存的具體資料:
                    Address+0                 Address+1               Address+2            Address+3
Contents        0x40                         0x90                           0x00                      0x00     接下來我們驗證下上面的資料表示的到底是不是4.5,從而也看下它的轉換過程。
由於浮點數不是以直接格式儲存,他有幾部分組成,所以要轉換浮點數,首先要把各部分的值分離出來。
                  Address+0      Address+1                  Address+2             Address+3
格式         SEEEEEEE     EMMMMMMM       MMMMMMMM     MMMMMMMM
二進位制     01000000         10010000               00000000                00000000
16進位制     40                         90                            00                            00
       可見:
       S: 為0,是個正數。
       E:為 10000001   轉為10進製為129,129-127=2,即實際指數部分為2。
       M:為 00100000000000000000000。 這裡,在底數左邊省略儲存了一個1,使用 實際底數表示為 1.00100000000000000000000
       到此,我們吧三個部分的值都拎出來了,現在,我們通過指數部分E的值來調整底數部分M的值。調整方法為:如果指數E為負數,底數的小數點向左移,如果指數E為正數,底數的小數點向右移。小數點移動的位數由指數E的絕對值決定。
      這裡,E為正2,使用向右移2為即得:
      100.100000000000000000000
至次,這個結果就是4.5的二進位制浮點數,將他換算成10進位制數就看到4.5了,如何轉換,看下面:
小數點左邊的100 表示為 (1 × 22) + (0 × 21) + (0 × 20), 其結果為 4。
小數點右邊的 .100… 表示為 (1 × 2-1) + (0 × 2-2) + (0 × 2-3) + ... ,其結果為.5 。
以上二值的和為4.5, 由於S 為0,使用為正數,即4.5 。
所以,16進位制 0x40900000 是浮點數 4.5 。

上面是如何將計算機儲存中的二進位制數如何轉換成實際浮點數,下面看下如何將一浮點數裝換成計算機儲存格式中的二進位制數。
舉例將17.625換算成 float型。
首先,將17.625換算成二進位制位:10001.101   ( 0.625 = 0.5+0.125, 0.5即 1/2, 0.125即 1/8 如果不會將小數部分轉換成二進位制,請參考其他書籍。) 再將 10001.101 向右移,直到小數點前只剩一位 成了 1.0001101 x 2的4次方(因為右移了4位)。此時 我們的底數M和指數E就出來了:
底數部分M,因為小數點前必為1,所以IEEE規定只記錄小數點後的就好,所以此處底數為   0001101 。
指數部分E,實際為4,但須加上127,固為131,即二進位制數 10000011 
符號部分S,由於是正數,所以S為0.
綜上所述,17.625的 float 儲存格式就是:
0 10000011 00011010000000000000000
轉換成16進位制:0x41 8D 00 00


-----------------------------------------------------我是分割線-------------------------------------

int,long int,short int的寬度都可能隨編譯器而異。但有幾條鐵定的原則(ANSI/ISO制訂的):

  • sizeof(short int)<=sizeof(int)

  • sizeof(int)<=sizeof(long int)

  • short int至少應為16位(2位元組)

  • long int至少應為32位。

下面給出不同位數編譯器下的基本資料型別所佔的位元組數:



16位編譯器


char :1個位元組
char*(即指標變數): 2個位元組
short int : 2個位元組
int:  2個位元組
unsigned int : 2個位元組
float:  4個位元組
double:  8個位元組
long:  4個位元組
long long:  8個位元組
unsigned long:  4個位元組


32位編譯器


char :1個位元組
char*(即指標變數): 4個位元組(32位的定址空間是2^32, 即32個bit,也就是4個位元組。同理64位編譯器)
short int : 2個位元組
int:  4個位元組
unsigned int : 4個位元組
float:  4個位元組
double:  8個位元組
long:  4個位元組
long long:  8個位元組
unsigned long:  4個位元組


64位編譯器

char :1個位元組
char*(即指標變數): 8個位元組
short int : 2個位元組
int:  4個位元組
unsigned int : 4個位元組
float:  4個位元組
double:  8個位元組
long:  8個位元組
long long:  8個位元組
unsigned long:  8個位元組

相關推薦

c語言基本資料型別位數

1.C++的short、int、long和long long型別通過使用不同數目的位來儲存值,最多能夠表示4中不同的整數寬度。C++提供了一種靈活的標準,它確保了最小長度(從C語言借鑑而來),如下: 1. short 至少16位 2. int 至少與 short 一樣長 3

基本資料型別的位元組數【C/C++】

 1.      儲存容量單位         計算機以“位”序列儲存資料,每一“位”儲存0或1。這裡的“位”便是儲存資訊的一個單位:bit。         位元組:Byte 。1 Byte= 8bits         字:“字”由若干個位元組構成,字的位數叫做字長,字

c語言常用資料型別佔用的位元組數

一、資料型別所佔用位元組數與機器字長與編譯器有關,遵循的幾條規律如下: sizeof(short int )<=sizeof(int) sizeof(int)<=sizeof(long int) short int 至少應為16位(2個位元組) long in 至少應為32位(

5. C語言基本資料型別及構造資料型別,浮點型儲存規則及記憶體模型

  其實學習C語言的時候有一件很頭疼的事就是各種各樣的資料型別,不同的場合不同的用途不同的資料要使用不同的資料型別,那又為什麼要分出這麼多種型別呢,因為型別決定了開闢空間的大小,開闢空間的大小又決定了儲存的範圍。今天,就資料型別這個問題我們來掰扯掰扯。   C

java之基本資料型別的位元組數

byte 1位元組 short 2位元組 char 2位元組(C語言中是1位元組)可以儲存一個漢字 int 4位元組 long 8位元組

C語言基本資料型別short、int、long、char、float、double

1.概述  C 語言包含的資料型別如下圖所示2.各種資料型別介紹2.1整型  整形包括短整型、整形和長整形。2.1.1短整形  short a=1;2.1.2整形  一般佔4個位元組(32位),最高位代表符號,0表示正數,1表示負數,取值範圍是-2147483648~2147

iOS基本資料型別記憶體大小

1、在swift中基本的資料型別都有哪些? Float、CGFloat、Double、float_t、Float32、Float64、Float80、double_t Int、int_fast8_t

java基本資料型別位元組數

JAVA基本資料型別所佔位元組數是多少?(32位系統) byte     1位元組                short    2位元組                int      4位元組                long     8位元組                char  

C語言基本資料型別簡介

1.概述   C 語言包含的資料型別如下圖所示: 2.各種資料型別介紹 2.1整型   整形包括短整型、整形和長整形。 2.1.1短整形   short a=1; 2.1.2整形   一般佔4個位元組(32位),最高位代表符號,0表示正數,1表示負數,取值範圍是-2147483648~2147483647

C語言基本資料型別

一,整型   char    short    int  long      、long long(C99新加入),再與unsigned搭配,共有10種類型 c,八進位制和十六進位制的整數常量(無負數) 234u,234, 在C語言中預設的數字為十進位制。如果在一個數字前面

Java八種基本資料型別位元組

資料型別  位元組數 byte      1位元組 short     2位元組 char      2位元組(C語言中是1位元組) float     4位元組 int       4位元組

c語言中各型別位元組大小

32位編譯器 char :1個位元組 char*(即指標變數): 4個位元組(32位的定址空間是2^32, 即32個bit,也就是4個位元組。同理64位編譯器) short int : 2個位元組 int: 4個位元組 unsigned int : 4個位元組 float:

C語言基本資料型別對應位元組大小及printf函式輸出格式

補充說明:4位元組:int(%d),unsigned=unsigned int(%u),long=long int(%ld),unsigned long(%lu),float(%f)8位元組:double(%lf),unsigned long long(%llu),long

C語言程式設計入門之--第四章C語言基本資料型別

    導讀:C語言程式中經常涉及一些數學計算,所以要熟悉其基本的資料型別。資料型別學習起來比較枯燥,不過結合之前的記憶體概念,以及本節的位元組概念,相信資料型別也就不難理解了。本章從二進位制的基本概念開始,然後介紹機器語言通用的計算單位位元組,最後再介紹C語言中基本的資料型別及其基本概念。 &

Dev-C++下基本型別位數和取值範圍:

符號屬性     長度屬性     基本型     所佔位數     取值範圍       輸入符舉例      輸出符舉例 --            --          char         8         -2^7 ~ 2^7-1        %c 

[C/C++]C++下基本型別位數和取值範圍

C++下基本型別所佔位數和取值範圍:符號屬性      長度屬性      基本型      所佔位數      取值範圍   輸入符舉例       輸出符舉例--                    --           char          8      

C語言資料型別位元組數

char :1個位元組 unsigned char :1個位元組 char*(即指標變數): 4個位元組(32位的定址空間是2^32, 即32個bit,也就是4個位元組。同理64位編譯器) short : 2個位元組 unsigned short : 2個位元組 int:  4個位元組 unsigned in

C/C++中基本資料型別在不同系統中空間大小

關於這個基本的問題,很早以前就很清楚了,C標準中並沒有具體給出規定那個基本型別應該是多少位元組數,而且這個也與機器、OS、編譯器有關,比如同樣是在32bits的作業系統系,VC++的編譯器下int型別

Object c/swift,java,c/c++在32位和64位各個平臺上基本資料型別 佔有的位元組數

現在很多app和伺服器互動,雙方收到對方收據,怎麼才能完整解析訊息,是大家都會遇到的問題。現在來看以下他們的位元組長度差異。 iOS 64位編譯器,對應64位系統,包含機型(iphone5s—同時執行32位應用和64位應用,iphone6, iphone6

java 各基本資料型別 佔有的位元組數

  Int: 4 位元組 Short: 2位元組 Long: 8位元組 Byte: 1位元組 Character: 2位元組 Float: 4位元組 Double: 8位元組 Boolean:系統沒有提供Size方法;   public class Ca