源代碼
/**
*********************************************************************
* @file overflow.c
* @author Zhen Haiyang
* @version 1.0
* @date 2021-06-02 23:37:15
* @brief 驗證溢出問題
*********************************************************************
*/
#include <stdio.h>
int main()
{
unsigned int x = 0xF0000000;
printf("%u\n", x);
unsigned long long y = (unsigned long long)x * 2;
printf("%llu\n", y);
y = x * 2;
printf("%llu\n", y);
return 0;
}
輸出結果
4026531840
8053063680
3758096384
分析
c語言中的類型轉換方式為:
- 整形運算總是至少按照整數類型(int)的精度進行的。也就是說,若兩個char類型的加法的運算過程可以分解為:先将兩個char類型轉換為int型,計算結果存儲為int型,最後強轉為char類型存儲。
- 如果兩個運算數的精度有一個超過int型。若兩個操作數屬于不同類型,那麼,将運算将兩個運算數都轉換成高精度類型再參與運算。若兩個操作數為相同類型,即使是乘法,還是會按照相同類型計算存儲結果。這就是可能會造成溢出現象,需要注意。