天天看點

C語言之溢出源代碼輸出結果分析

源代碼

/**
 *********************************************************************
 * @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語言中的類型轉換方式為:

  1. 整形運算總是至少按照整數類型(int)的精度進行的。也就是說,若兩個char類型的加法的運算過程可以分解為:先将兩個char類型轉換為int型,計算結果存儲為int型,最後強轉為char類型存儲。
  2. 如果兩個運算數的精度有一個超過int型。若兩個操作數屬于不同類型,那麼,将運算将兩個運算數都轉換成高精度類型再參與運算。若兩個操作數為相同類型,即使是乘法,還是會按照相同類型計算存儲結果。這就是可能會造成溢出現象,需要注意。