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

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

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

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

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

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

1. int 和 unsigned int 參與運(yùn)算時的轉(zhuǎn)換規(guī)則

當(dāng) intunsigned int 進(jìn)行運(yùn)算,運(yùn)算結(jié)果通常會轉(zhuǎn)換為 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 會轉(zhuǎn)換為 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 在運(yùn)算前會被轉(zhuǎn)換為 unsigned int,-5 變?yōu)?4294967291(在 32 位系統(tǒng)下)。
  • 4294967291 > 10,所以 a < b 變成 false,與直覺相反。

(3)避免問題的方法

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

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

當(dāng) unsigned intfloat / double 進(jìn)行運(yùn)算,運(yùn)算結(jié)果通常會轉(zhuǎn)換為 浮點(diǎn)型(float / double,原因如下:

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

C 語言規(guī)定:

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

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

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

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

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

(3)示例

#include <stdio.h>

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

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

    return 0;
}

輸出:

Result: 13.500000

分析:

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

3. 類型轉(zhuǎn)換規(guī)則總結(jié)

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

重點(diǎn)總結(jié)

  1. int unsigned int 運(yùn)算時,int 會被轉(zhuǎn)換為 unsigned int

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

    • 避免精度損失,確保浮點(diǎn)計算的準(zhǔn)確性。
  3. 為了避免類型轉(zhuǎn)換問題,推薦

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

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

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

相關(guān)文章

  • 淺談C++對象組合

    淺談C++對象組合

    本文主要說明對象創(chuàng)建時構(gòu)造函數(shù)的執(zhí)行順序,對象成員的初始化順序;對象銷毀時析構(gòu)函數(shù)的執(zhí)行順序,對象成員的銷毀順序。
    2015-06-06
  • C++如何實(shí)現(xiàn)DNS域名解析

    C++如何實(shí)現(xiàn)DNS域名解析

    這片文章介紹了C++如何實(shí)現(xiàn)DNS域名解析,還有對相關(guān)技術(shù)的介紹,代碼很詳細(xì),需要的朋友可以參考下
    2015-07-07
  • C語言背包問題求解全過程(貪心方法)

    C語言背包問題求解全過程(貪心方法)

    背包問題是一個經(jīng)典的動態(tài)規(guī)劃問題,而貪心算法是一種常用的解決背包問題的方法,這篇文章主要給大家介紹了關(guān)于C語言背包問題求解(貪心方法)的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-06-06
  • C++語法中的函數(shù)重載和默認(rèn)參數(shù)

    C++語法中的函數(shù)重載和默認(rèn)參數(shù)

    這篇文章主要介紹了C++語法中的函數(shù)重載和默認(rèn)參數(shù),本文從語法角度通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-03-03
  • C++ 實(shí)現(xiàn)對象的克隆 (多種方法)

    C++ 實(shí)現(xiàn)對象的克隆 (多種方法)

    在 C++ 中,對象的克隆通常通過實(shí)現(xiàn)一個克隆接口來完成,該接口允許創(chuàng)建對象的深拷貝,下面是實(shí)現(xiàn)對象克隆的幾種方法,具體取決于需要克隆的對象類型和上下文,感興趣的朋友跟隨小編一起看看吧
    2024-12-12
  • Visual?C++?6.0添加一個對話框的實(shí)現(xiàn)步驟

    Visual?C++?6.0添加一個對話框的實(shí)現(xiàn)步驟

    VC6.0是微軟公司推出的一款集成開發(fā)環(huán)境,本文主要介紹了Visual?C++?6.0添加一個對話框的實(shí)現(xiàn)步驟,具有一定的參考價值,感興趣的可以了解一下
    2024-06-06
  • Visual?Studio中的解決方案中不顯示項目分析

    Visual?Studio中的解決方案中不顯示項目分析

    這篇文章主要為大家介紹了Visual?Studio中的解決方案中不顯示項目問題分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-11-11
  • C++中volatile和mutable關(guān)鍵字用法詳解

    C++中volatile和mutable關(guān)鍵字用法詳解

    這篇文章主要介紹了C++中volatile和mutable關(guān)鍵字用法詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02
  • 一篇文章帶你了解C語言的一些重要字符串與內(nèi)存函數(shù)

    一篇文章帶你了解C語言的一些重要字符串與內(nèi)存函數(shù)

    這篇文章主要介紹了C語言字符函數(shù)、內(nèi)存函數(shù) 功能,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-09-09
  • 如何用C++實(shí)現(xiàn)A*尋路算法

    如何用C++實(shí)現(xiàn)A*尋路算法

    尋路是游戲比較重要的一個組成部分。因為不僅AI還有很多地方(例如RTS游戲里操控人物點(diǎn)到地圖某個點(diǎn),然后人物自動尋路走過去)都需要用到自動尋路的功能。本文將介紹一個經(jīng)常被使用且效率理想的尋路方法-A*尋路算法,并且提供額外的優(yōu)化思路
    2021-06-06

最新評論