c語言long和long long的取值範圍
溢位和取值範圍
C語言的整型溢位問題
整數溢位
- int、long int 、long long int 佔用位元組
《C和指標》中寫過:long與int:標準只規定long不小於int的長度,int不小於short的長度。
double與int型別的儲存機制不同,long int的8個位元組全部都是資料位,而double是以尾數,底數,指數的形式表示的,類似科學計數法,因此double比int能表示的資料範圍更廣。
long long在win32中是確實存在,長度為8個位元組;定義為LONG64。
為什麼會出現long int呢?在win32現在系統中,長度為4;在歷史上,或者其他某些系統中,int長度為2,是short int。
即便是long long,在TI的有款平臺中,長度為5也就是說,每種型別長度,需要sizeof才知道,如果可能,最好用union看看裡面的資料,可以消除一些型別的假象長度。
型別名稱 | 位元組數 | 取值範圍 |
---|---|---|
signed char | 1 | -128~+127 |
short int | 2 | -32768~+32767 |
int | 4 | -2147483648~+2147483647 |
long int | 4 | -2147483648~+2141483647 |
long long long int | 8 | -9223372036854775808~+9223372036854775807 |
unsigned int (unsigned long)
-
4位元組8位可表達位數:2^32=42 9496 7296
-
範圍:0 ~ 42 9496 7295 (42*10^8)
int (long)
-
4位元組8位可表達位數:2^32=42 9496 7296
-
範圍:-21 4748 3648 ~ 21 4748 3647 (21*10^8)
long long (__int64)
-
8位元組8位可表達位數:2^64=1844 6744 0737 0960 0000
-
範圍:-922 3372 0368 5477 5808 ~ 922 3372 0368 5477 5807 (922*10^16)
unsigned long (unsigned __int64)
-
8位元組8位可表達位數:2^64=1844 6744 0737 0960 0000
-
範圍:0 ~ 1844 6744 0737 0955 1615 (1844*10^16)
最大值、最小值
在#include存有各個型別的最大值和最小值
表示 | 型別 |
---|---|
CHAR_MIN | char的最小值 |
SCHAR_MAX | signed char 最大值 |
SCHAR_MIN | signed char 最小值 |
UCHAR_MAX | unsigned char 最大值 |
SHRT_MAX | short 最大值 |
SHRT_MIN | short 最小值 |
USHRT_MAX | unsigned short 最大值 |
INT_MAX | int 最大值 |
INT_MIN | int 最小值 |
UINT_MAX | unsigned int 最大值 |
UINT_MIN | unsigned int 最小值 |
LONG_MAX | long最大值 |
LONG_MIN | long最小值 |
ULONG_MAX | unsigned long 最大值 |
FLT_MANT_DIG | float 型別的尾數 |
FLT_DIG | float 型別的最少有效數字位數 |
FLT_MIN_10_EXP | 帶有全部有效數的float型別的負指數的最小值(以10為底) |
FLT_MAX_10_EXP | float型別的正指數的最大值(以10為底) |
FLT_MIN | 保留全部精度的float型別正數最小值 |
FLT_MAX | float型別正數最大值 |