C語言 形參和實參

西北野狼發表於2024-10-01

在C語言中,強制型別轉換(強轉)可能會導致精度發生變化,具體情況取決於轉換的型別。

  1. 數值型別轉換

    • 浮點數轉換為整數
      • 當把浮點數強制轉換為整數時,小數部分會被直接截斷,精度必然會發生變化。例如:
        float num = 3.14;
        int result = (int)num;
        // 此時result的值為3,小數部分0.14被截斷
        
    • 高精度整數轉換為低精度整數
      • 例如,將long long型別轉換為int型別(假設long long的取值範圍大於int),如果long long型別的值超出了int型別的取值範圍,就會發生資料截斷,導致精度變化。
        long long bigNum = 10000000000LL;
        int smallResult = (int)bigNum;
        // 由於bigNum超出了int的取值範圍,smallResult的值可能是一個錯誤的值
        
    • 整數轉換為浮點數
      • 通常情況下,將整數轉換為浮點數不會損失精度(在浮點數能夠表示該整數的範圍內)。例如:
        int num = 5;
        float result = (float)num;
        // result的值為5.0,沒有精度損失
        
    • 不同精度浮點數之間的轉換
      • 當把高精度的浮點數(如double)轉換為低精度的浮點數(如float)時,可能會發生精度損失。因為float的有效數字位數比double少。
        double bigDouble = 1.23456789012345;
        float smallFloat = (float)bigDouble;
        // smallFloat的值可能會近似為1.2345679,精度有所損失
        
  2. 指標型別轉換(特殊情況)

    • 指標型別轉換本身不涉及數值精度的概念,但如果不正確地使用轉換後的指標進行資料訪問,可能會導致資料錯誤解讀,類似於精度問題。例如,將int *型別的指標強制轉換為char *型別的指標,然後按char型別逐個位元組地訪問原本為int型別的資料,會導致資料的錯誤理解。
    • 如果將一個指標型別轉換為不相容的指標型別(例如,將指向結構體的指標轉換為指向函式的指標)並進行解引用操作,這是未定義行為,可能會產生不可預測的結果,這也可以看作是一種特殊的“精度”(資料完整性)被破壞的情況。

相關文章