C語言 - 整數與浮點數運算的類型轉換規則

C 語言整數與浮點數運算的類型轉換規則

在 C 語言中,不同數據類型在運算時會進行 隱式類型轉換。當 有符號整數(int無符號整數(unsigned int浮點型(floatdouble 進行運算時,編譯器會根據類型優先級和轉換規則自動調整運算的數據類型


1. intunsigned int 參與運算時的轉換規則

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

(1)無符號優先(Unsigned Dominance Rule)

C 語言規定:

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

(2)示例

#include <stdio.h>int main() {int a = -5;unsigned int b = 10;if (a < b) {  // a 會轉換為 unsigned intprintf("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 變為 4294967291(在 32 位系統下)。
  • 4294967291 > 10,所以 a < b 變成 false,與直覺相反。

(3)避免問題的方法

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

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

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

(1)浮點類型優先

C 語言規定:

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

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

  1. 浮點數的表示范圍比 unsigned int 更大

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

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

(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,變為 10.0f
  • 計算 10.0f + 3.5f = 13.5f,結果類型為 float

3. 類型轉換規則總結

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

4. 重點總結

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

    • 負數可能變為超大正數,導致邏輯錯誤。
  2. unsigned intfloat/double 運算時,unsigned int 會轉換為 float/double

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

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

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

(完)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/898993.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/898993.shtml
英文地址,請注明出處:http://en.pswp.cn/news/898993.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

用SVG繞過瀏覽器XSS審計

[Translated From]&#xff1a;http://insert-script.blogspot.com/2014/02/svg-fun-time-firefox-svg-vector.html SVG - <use> element SVG中的<use>元素用于重用其他元素&#xff0c;主要用于聯接<defs>和alike&#xff0c;而我們卻用它來引用外部SVG文件…

【構建CV圖像識別系統】從傳統方法到深度學習

目錄 1. 圖像的基本概念1.1 像素與色彩1.2 過濾與卷積 2. 圖像分類與檢測3. 圖像特征的提取3.1 全局特征3.2 局部特征3.2.1 邊緣&#xff08;Edge&#xff09;3.2.2 角點&#xff08;Corner&#xff09;3.2.3 SIFT 特征 4. 傳統方法與深度學習在圖像識別中的應用4.1 基于傳統方…

Kubernetes高級應用之-重啟策略

一、介紹&#xff0b;擴展應用&#xff08;涉及的高級資源在后續會寫出來&#xff09; # Kubernetes Pod重啟策略&#xff08;RestartPolicy&#xff09;全面解析 ## 一、重啟策略的核心價值與重要性 在Kubernetes集群中&#xff0c;Pod重啟策略&#xff08;RestartPolicy&a…

簡記_單片機硬件最小系統設計

以STM32為例&#xff1a; 一、電源 1.1、數字電源 IO電源&#xff1a;VDD、VSS&#xff1a;1.8~3.6V&#xff0c;常用3.3V&#xff0c;去耦電容1 x 10u N x 100n &#xff1b; 內核電源&#xff1a;內嵌的穩壓器輸出&#xff1a;1.2V&#xff0c;給內核、存儲器、數字外設…

matlab使用fmincon開加速

在使用 fmincon 進行優化時&#xff0c;可以通過以下方法加速優化過程。這些方法主要涉及算法選擇、并行計算、減少函數調用次數等。以下是具體建議和實現方式&#xff1a; 1. 選擇合適的優化算法 fmincon 支持多種優化算法&#xff0c;不同的算法適用于不同類型的優化問題。選…

MySQL顛覆版系列————MySQL新特性(開啟數據庫的新紀元)下篇

文章目錄 前言五、持久化全局變量5.1 持久化全局變量特點5.2 持久化全局變量實例5.3 持久化全局變量注意事項 六、降序索引&#xff08;Descending Indexes&#xff09;6.1 降序索引&#xff08;Descending Indexes&#xff09;特點6.2 降序索引&#xff08;Descending Indexes…

解析1688.item_search_shop接口:獲取店鋪所有商品返回數據詳細說明

一、引言 在電商領域&#xff0c;獲取特定店鋪的所有商品信息是運營分析、市場調研和自動化處理的重要基礎。1688作為國內領先的B2B電商平臺&#xff0c;提供了豐富的API接口供開發者使用。其中&#xff0c;item_search_shop接口允許開發者通過店鋪ID獲取該店鋪的所有商品信息…

新書速覽|OpenCV計算機視覺開發實踐:基于Python

《OpenCV計算機視覺開發實踐:基于Python》 本書內容 OpenCV是一個跨平臺計算機視覺和機器學習軟件庫&#xff0c;也是計算機視覺領域的開發人員必須掌握的技術。《OpenCV計算機視覺開發實踐:基于Python》基于Python 3.8全面系統地介紹OpenCV 4.10的使用&#xff0c;并配套示例…

微服務架構中的服務發現與 Consul 實踐

在微服務架構中&#xff0c;服務之間的通信是核心問題之一。隨著服務數量的增長&#xff0c;如何高效地管理和定位服務實例變得尤為重要。本文將介紹服務發現的基本概念&#xff0c;并詳細講解如何使用 Consul 進行服務注冊、發現和健康檢查。 1. 什么是服務發現&#xff1f; …

PyTorch 深度學習實戰(24):分層強化學習(HRL)

一、分層強化學習原理 1. 分層學習核心思想 分層強化學習&#xff08;Hierarchical Reinforcement Learning, HRL&#xff09;通過時間抽象和任務分解解決復雜長程任務。核心思想是&#xff1a; 對比維度傳統強化學習分層強化學習策略結構單一策略直接輸出動作高層策略選擇選…

車載網絡測試實操源碼_使用CAPL腳本進行UDS刷寫及其自動化測試

系列文章目錄 使用CAPL腳本解析hex、S19、vbf文件 使用CAPL腳本對CAN報文的Counter、CRC、周期、錯誤幀進行實時監控 使用CAPL腳本模擬發送符合協議要求(Counter和CRC)的CAN報文 使用CAPL腳本控制繼電器實現CAN線、電源線的通斷 使用CAPL腳本實現安全訪問解鎖 使用CAPL腳本實現…

Spring Boot整合Spring Data JPA

Spring Data作為Spring全家桶中重要的一員&#xff0c;在Spring項目全球使用市場份額排名中多次居前位&#xff0c;而在Spring Data子項目的使用份額排名中&#xff0c;Spring Data JPA也一直名列前茅。Spring Boot為Spring Data JPA提供了啟動器&#xff0c;使Spring Data JPA…

JS 應用WebPack 打包器第三方庫 JQuery安裝使用安全檢測

# 打包器 -WebPack- 使用 & 安全 參考&#xff1a; https://mp.weixin.qq.com/s/J3bpy-SsCnQ1lBov1L98WA Webpack 是一個模塊打包器。在 Webpack 中會將前端的所有資源文件都作為模塊處理。 它將根據模塊的依賴關系進行分析&#xff0c;生成對應的資源。 五個核心概…

Oracle歸檔配置及檢查

配置歸檔位置到 USE_DB_RECOVERY_FILE_DEST&#xff0c;并設置存儲大小 startup mount; !mkdir /db/archivelog ALTER SYSTEM SET db_recovery_file_dest_size100G SCOPEBOTH; ALTER SYSTEM SET db_recovery_file_dest/db/archivelog SCOPEBOTH; ALTER SYSTEM SET log_archive…

Four.meme是什么,一篇文章讀懂

一、什么是Four.meme&#xff1f; Four.meme 是一個運行在 BNB 鏈的去中心化平臺旨在為 meme 代幣供公平啟動服務。它允許用戶以極低的成本創建和推出 meme 代幣&#xff0c;無需預售或團隊分配&#xff0c;它消除了傳統的預售、種子輪和團隊分配&#xff0c;確保所有參與者有…

Simula語言的正則表達式

Simula語言中的正則表達式 引言 Simula是一種開創性的編程語言&#xff0c;最初在1960年代由Ole-Johan Dahl和Kristen Nygaard在挪威的計算機中心開發。它不僅是面向對象編程的先驅&#xff0c;還在模擬和各種計算領域有顯著的應用。然而&#xff0c;Simula語言本身并不直接支…

Java 集合 List、Set、Map 區別與應用

一、核心特性對比 二、底層實現與典型差異 ?List? ?ArrayList?&#xff1a;動態數組結構&#xff0c;隨機訪問快&#xff08;O(1)&#xff09;&#xff0c;中間插入/刪除效率低&#xff08;O(n)&#xff09;??LinkedList?&#xff1a;雙向鏈表結構&#xff0c;頭尾操作…

【第二月_day7】Pandas 簡介與數據結構_Pandas_ day1

以下是專為小白設計的 Pandas 簡介與數據結構 學習內容&#xff0c;用最通俗的語言和案例講解核心概念&#xff1a; 一、安裝 Pandas 1. 安裝方法 打開電腦的命令提示符&#xff08;Windows&#xff09;或終端&#xff08;Mac/Linux&#xff09;輸入以下命令并回車&#xff1…

歡迎來到未來:探索 Dify 開源大語言模型應用開發平臺

歡迎來到未來&#xff1a;探索 Dify 開源大語言模型應用開發平臺 如果你對 AI 世界有所耳聞&#xff0c;那么你一定聽說過大語言模型&#xff08;LLM&#xff09;。這些智能巨獸能夠生成文本、回答問題、甚至編寫代碼&#xff01;但是&#xff0c;如何將它們變成真正的實用工具…

python多線程和多進程的區別有哪些

python多線程和多進程的區別有七種&#xff1a; 1、多線程可以共享全局變量&#xff0c;多進程不能。 2、多線程中&#xff0c;所有子線程的進程號相同&#xff1b;多進程中&#xff0c;不同的子進程進程號不同。 3、線程共享內存空間&#xff1b;進程的內存是獨立的。 4、同一…