C/C++ 數據類型 表示最大 最小數值 探討


 

C/C++中存儲數字格式有整型和浮點型 字符型數據本質上也是以整型存儲

 


整型

對於整型數據,最大值最小值很好計算

先確定對應數據型在本地所占用的字節數,同一數據型由於系統或者編譯器的不同,所占字節不同,可以通過sizeof()函數查看,例如:

cout << sizeof(int) <<endl;

例如在我的電腦中 int 占用四個字節(即32位),1位符號位+31位數值位
所以int可表示的值得范圍為 -2^31 — 2^31-1 (這里正負數不對稱,減一是因為還有一個0)

同樣的,對於整型都可以這么計算,通過所占字節數(即多少位)可以計算出它可以表示的最大最小值,需要注意的是對於無符號型,所有的位都是數值位,沒有符號位,即沒有負數。

 


浮點型

首先我們要知道,對於浮點型數據,計算機是以指數形式存儲的。
即 a^b  a的b次方

具體格式
float型(通常為32位) 1位符號位+8位指數位+23位數值位(尾數位)

double型(通常為64位) 1位符號位+11位指數位+53位數值位(尾數位)

(這里數據型所占字節數可能也有差異,具體占用內存大小可通過之前的代碼自行查看,這里選擇一般情況作為舉例)

顧名思義,符號位即0為正,1為負, 指數位表示次方大小,尾數位表示精度(precision)。和上面的式子對照,尾數位表示a,指數位表示b。這里尾數位的小數點默認在第一位最高位以后,以float為例,即尾數位最大表示的數為1.1111111111111111111111(二進制表示);不超過2。

例如 float 23位尾數位 即換算成十進制最大為2^23=8388608 所以float的精度位6-7位,6位精度可以保證,7位精度只能表示部分。
double 同理,精度為15-16位,15位精度可以保證正確,16位精度只能表示部分。

下面看float和double可以表示的最大值和最小值(這里最小值指最接近零的值)

float 理論上能表示的最大值:符號位為正 指數位最大127 尾數位全為1
即(2-2^22)^127 = 3.4028e+38
理論上最小值:(2-2^22)^-128 = 5.8776e-39

double 類型同樣方法可以算的,不再贅述。

當然這只是理論值,具體數值在<float.h>頭文件中有定義
打開float.h文件 可以看到看到以下代碼:

#define DBL_DECIMAL_DIG 17                          // # of decimal digits of rounding precision
#define DBL_DIG 15                                  // # of decimal digits of precision
#define DBL_EPSILON 2.2204460492503131e-016         // smallest such that 1.0+DBL_EPSILON != 1.0
#define DBL_HAS_SUBNORM 1                           // type does support subnormal numbers
#define DBL_MANT_DIG 53                             // # of bits in mantissa
#define DBL_MAX 1.7976931348623158e+308             // max value
#define DBL_MAX_10_EXP 308                          // max decimal exponent
#define DBL_MAX_EXP 1024                            // max binary exponent
#define DBL_MIN 2.2250738585072014e-308             // min positive value
#define DBL_MIN_10_EXP (-307)                       // min decimal exponent
#define DBL_MIN_EXP (-1021)                         // min binary exponent
#define _DBL_RADIX 2                                // exponent radix
#define DBL_TRUE_MIN 4.9406564584124654e-324        // min positive value

#define FLT_DECIMAL_DIG 9                           // # of decimal digits of rounding precision
#define FLT_DIG 6                                   // # of decimal digits of precision
#define FLT_EPSILON 1.192092896e-07F                // smallest such that 1.0+FLT_EPSILON != 1.0
#define FLT_HAS_SUBNORM 1                           // type does support subnormal numbers
#define FLT_GUARD 0
#define FLT_MANT_DIG 24                             // # of bits in mantissa
#define FLT_MAX 3.402823466e+38F                    // max value
#define FLT_MAX_10_EXP 38                           // max decimal exponent
#define FLT_MAX_EXP 128                             // max binary exponent
#define FLT_MIN 1.175494351e-38F                    // min normalized positive value
#define FLT_MIN_10_EXP (-37)                        // min decimal exponent
#define FLT_MIN_EXP (-125)                          // min binary exponent
#define FLT_NORMALIZE 0
#define FLT_RADIX 2                                 // exponent radix
#define FLT_TRUE_MIN 1.401298464e-45F               // min positive value

查看源代碼,可以看到float最大值和我們理論值相同,但最小值不一樣,double類型同樣如此
對於最小值是怎么算的,為什么這么算,這一點我也不是很懂,如果有大佬看到,希望大佬解釋。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM