資料溢位
基本資料型別
基本資料型別分兩大類:
- 整型
- 浮點型
- 整型包括char,short,int,long,long long
- 除此之外,整型還有無符號型別unsigned ...
- 浮點型包括float,double,long double
規則:
short至少16位,int至少和short一樣長;
long至少32位,至少和int一樣長;
long long至少64位,至少和long一樣長。
float至少4個位元組;
double至少6個位元組,並且不少於float;
long double至少和double一樣長。
資料範圍
不同的系統環境,資料範圍有所不同;32位/64位作業系統,資料範圍也有所不同。
可以通過程式碼來確定不同的範圍:
- c語言定義了一系列的巨集
#include <stdio.h> #include <limits.h> int main() { printf("max integer: %d\n", INT_MAX); printf("min integer: %d\n", INT_MIN); return 0; }
- C++ 數值極限
#include <iostream> #include <limits> int main() { std::cout << numeric_limits<int>::max() << endl; std::cout << numeric_limits<int>::min() << endl; return 0; }
資料型別應用
介紹個親身遇到的資料溢位的問題。
- 資料壓縮後還原導致溢位
int d = 0; long value = d * 1000 + 10;
上面一段程式碼就有發生資料溢位的可能。當變數d足夠大時,再乘以1000就會溢位。結果可想而知,是一個相對小的數值。
//可以這樣改寫,就不會出現問題 long value = (long)d * 1000 + 10;
- C/C++基本資料型別,每一種都有範圍。在選擇資料型別要注意合適的範圍,否則會造成資料溢位,產生難以發現的bug。