欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C語言之整數(shù)與浮點數(shù)運算的類型轉換規(guī)則詳解

 更新時間:2025年03月26日 09:31:03   作者:Peter_Deng.  
這篇文章主要介紹了C語言之整數(shù)與浮點數(shù)運算的類型轉換規(guī)則,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教

C語言整數(shù)與浮點數(shù)運算的類型轉換規(guī)則

在 C 語言中,不同數(shù)據(jù)類型在運算時會進行 隱式類型轉換

有符號整數(shù)(int、無符號整數(shù)(unsigned int浮點型(floatdouble 進行運算時,編譯器會根據(jù)類型優(yōu)先級和轉換規(guī)則自動調(diào)整運算的數(shù)據(jù)類型。

1. int 和 unsigned int 參與運算時的轉換規(guī)則

intunsigned int 進行運算,運算結果通常會轉換為 unsigned int,原因如下:

(1)無符號優(yōu)先(Unsigned Dominance Rule)

C 語言規(guī)定:

如果一個操作數(shù)是 int,另一個操作數(shù)是 unsigned int,并且它們具有相同的寬度(如 32 位),那么 int 會被提升為 unsigned int。

(2)示例

#include <stdio.h>

int main() {
    int a = -5;
    unsigned int b = 10;

    if (a < b) {  // a 會轉換為 unsigned int
        printf("a < b is true\n");
    } else {
        printf("a < b is false\n");
    }
    return 0;
}

輸出:

a < b is false

分析:

  • a-5int),b10unsigned int)。
  • a 在運算前會被轉換為 unsigned int,-5 變?yōu)?4294967291(在 32 位系統(tǒng)下)。
  • 4294967291 > 10,所以 a < b 變成 false,與直覺相反。

(3)避免問題的方法

  1. 使用顯式類型轉換
if ((int)a < (int)b) {
    printf("Correct comparison\n");
}
  1. 避免 int unsigned int 混用
unsigned int a = 5;
unsigned int b = 10;
  1. 使用 size_t 進行安全比較
    • size_t 是無符號整數(shù),適用于數(shù)組索引等情況。

2. unsigned int 和浮點數(shù) (float / double) 參與運算時的轉換規(guī)則

unsigned intfloat / double 進行運算,運算結果通常會轉換為 浮點型(float / double,原因如下:

(1)浮點類型優(yōu)先

C 語言規(guī)定:

如果一個操作數(shù)是 unsigned int,另一個操作數(shù)是 float double,則 unsigned int 會自動轉換為 float / double

(2)為什么不轉換為 unsigned int?

  1. 浮點數(shù)的表示范圍比 unsigned int 更大

    • 32 位 unsigned int 的最大值為 42949672952^32 - 1)。
    • float 可表示 ~3.4 × 10^38,double 可表示 ~1.8 × 10^308。
    • 浮點數(shù)可表示的范圍遠遠超過無符號整數(shù),因此轉換方向是 unsigned int → float/double,而不會反向轉換。
  2. 浮點數(shù)可以表示小數(shù),整數(shù)不行

    • 例如:5 / 2.0 = 2.5,如果轉換為 unsigned int,會丟失 .5,變成 2,這會導致精度損失。
    • 為了避免精度丟失,C 語言默認將 unsigned int 轉換為 float double 進行計算。

(3)示例

#include <stdio.h>

int main() {
    unsigned int a = 10;
    float b = 3.5;

    float result = a + b;  // `a` 轉換為 `float`
    printf("Result: %f\n", result); 

    return 0;
}

輸出:

Result: 13.500000

分析:

  • aunsigned int)被轉換為 float,變?yōu)?10.0f。
  • 計算 10.0f + 3.5f = 13.5f,結果類型為 float。

3. 類型轉換規(guī)則總結

運算類型結果數(shù)據(jù)類型說明
int + unsigned intunsigned intint 先轉換為 unsigned int,可能導致負數(shù)變大數(shù)
unsigned int + floatfloatunsigned int 先轉換為 float,然后計算
unsigned int + doubledoubleunsigned int 先轉換為 double,然后計算
unsigned int * floatfloatunsigned int 先轉換為 float,然后計算
unsigned int * doubledoubleunsigned int 先轉換為 double,然后計算

重點總結

  1. int unsigned int 運算時,int 會被轉換為 unsigned int

    • 負數(shù)可能變?yōu)槌笳龜?shù),導致邏輯錯誤。
  2. unsigned intfloat/double 運算時,unsigned int 會轉換為 float/double

    • 避免精度損失,確保浮點計算的準確性。
  3. 為了避免類型轉換問題,推薦

    • 統(tǒng)一變量類型,避免 intunsigned int 混用。
    • 明確使用 floatdouble 進行浮點計算,不要依賴隱式轉換。
    • 使用 size_t 處理數(shù)組索引,避免 unsigned int 帶來的問題。

這些規(guī)則適用于 C 語言,也適用于 C++ 及其他類似的編程語言。

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • C++設計模式之迭代器模式(Iterator)

    C++設計模式之迭代器模式(Iterator)

    這篇文章主要為大家詳細介紹了C++設計模式之迭代器模式Iterator,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-04-04
  • C++語言實現(xiàn)拼圖游戲詳解

    C++語言實現(xiàn)拼圖游戲詳解

    這篇文章主要為大家詳細介紹了C++基于EasyX庫實現(xiàn)拼圖小游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • C++實現(xiàn)LeetCode(111.二叉樹的最小深度)

    C++實現(xiàn)LeetCode(111.二叉樹的最小深度)

    這篇文章主要介紹了C++實現(xiàn)LeetCode(111.二叉樹的最小深度),本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • C語言實現(xiàn)簡單反彈球消磚塊游戲

    C語言實現(xiàn)簡單反彈球消磚塊游戲

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)簡單反彈球消磚塊游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • Qt數(shù)據(jù)庫應用之超級自定義委托

    Qt數(shù)據(jù)庫應用之超級自定義委托

    Qt中需要用到自定義委托的情形很多,比如提供下拉框選擇,進度條展示下載進度啥的,默認的單元格是沒有這些效果的,需要自己單獨用委托的形式來展示。本文將為大家介紹Qt中如何進行超級自定義委托,需要的可以參考一下
    2022-03-03
  • C語言銀行系統(tǒng)課程設計

    C語言銀行系統(tǒng)課程設計

    這篇文章主要為大家詳細介紹了C語言銀行系統(tǒng)課程設計,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • 簡單掌握Linux系統(tǒng)中fork()函數(shù)創(chuàng)建子進程的用法

    簡單掌握Linux系統(tǒng)中fork()函數(shù)創(chuàng)建子進程的用法

    fork()函數(shù)只能在類Unix系統(tǒng)下使用,因為需要引入unistd頭文件,這里我們就來簡單掌握Linux系統(tǒng)中fork()函數(shù)創(chuàng)建子進程的用法,需要的朋友可以參考下
    2016-06-06
  • 深入講解Socket原理

    深入講解Socket原理

    這篇文章深入的講解Socket原理,并附帶實例代碼。小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2021-12-12
  • C++ 數(shù)據(jù)結構之kmp算法中的求Next()函數(shù)的算法

    C++ 數(shù)據(jù)結構之kmp算法中的求Next()函數(shù)的算法

    這篇文章主要介紹了C++ 數(shù)據(jù)結構之kmp算法中的求Next()函數(shù)的算法的相關資料,需要的朋友可以參考下
    2017-06-06
  • 如何讓C++函數(shù)返回值死心塌地為你工作

    如何讓C++函數(shù)返回值死心塌地為你工作

    這篇文章主要介紹了如何讓C++函數(shù)返回值死心塌地為你工作,小編覺得還是挺不錯的,具有一定借鑒價值,需要的朋友可以參考下
    2018-01-01

最新評論