隱式類型轉換 算術轉換

目錄

整型提升

間接證明整型提升的代碼案例

算術轉換?


整型提升

何為整型提升:

C語言的整型算術運算總是至少以缺省(默認)整型類型的精度來進行的

為了獲得這個精度,表達式中的字符類型短整型操作數在使用之前被轉換為普通整型(int類型),這種傳喚就被稱為整型提升

整型提升的意義:

表達式的整型運算要在CPU的相應運算器件內執行,CPU內整型運算器(ALU)的操作數的字節長度-般就是int的字節長度,同時也是CPU的通用寄存器的長度

因此,即使兩個char類型或者short類型的相加,在CPU執行時實際上也要先轉換為CPU內整型操作數的標準長度

如何進行整型提升呢??

整型提升是按照變量的數據類型的符號位來提升的

當符號位是1時,整型提升時高位補全符號位1

當符號位是0時,整型提升時高位補全符號位0

代碼舉例:

#include<stdio.h>
int main()
{char c1 = 5;char c2 = 127;char c3 = c1 + c2;printf("%d\n", c3);return 0;
}

c3以%d的形式打印的結果為多少呢,以及c1和c2在相加時是如何整型提升的呢?

代碼分析:

常量5和17分別存儲在char類型的變量c1和c2中的補碼(char長度為1字節)

若常量的值大于了char類型能存放的最大值,就會發生截斷

c1和c2整型提升后的補碼(按符號位整型提升)

c1 + c2;??c1和c2整型提升后相加的補碼存放在c3中:

?

char c3 = c1 + c2;? c3是char類型變量,所以存放時會發生截斷:

printf("%d\n", c3);? ? ?%d是以十進制的形式打印有符號的整數

那么c3在以%d的形式打印時又會發生整型提升(按符號位整型提升):?

c3的二進制原碼轉換為十進制為:1*2^2 +?1*2^3?+?1*2^4?+?1*2^5?+?1*2^6 = 124

且c3的最高位(符號位)為1,所以c3以%d的形式打印的結果為:-124?

代碼驗證:?


注意:無符號的數據類型整型提升時,高位補全直接補0


間接證明整型提升的代碼案例

代碼案例1:

#include<stdio.h>
int main()
{char a = 0xb6;short b = 0xb600; int c = 0xb6000000; if (a == 0xb6)printf("a");if(b == 0xb600)printf("b");if(c == 0xb6000000)printf("c");return 0;
}

0x --- 以0x開頭的數字表示這是一個十六進制的數字

十六進制中的b表示的是11,轉換為二進制為:1011

一個十六進制的數字表示4個bit

char a = 0xb6; ---?兩個十六進制的數字為8bit,剛好填滿char類型的a,且不會發生進位

short b = 0xb600; --- 四個十六進制的數字為16bit,剛好填滿short類型的b,且不會發生進位

當?if (a == 0xb6) 和?if(b==0xb600) 比較判斷時,就會發生算術運算,那么就必然會發生整型提升

所以 char類型的a 和 short類型的b 就會發生整型提升,a和b的最高位都是1,所以整型提升后的結果就會發生改變,自然判斷就不會全等

而int c = 0xb6000000;? ?int類型的c不會發生整型提升,所以判斷會全等,則打印的結果為c?

代碼驗證:


?代碼案例2:

#include<stdio.h>
int main()
{char c = 1;printf("%u\n", sizeof(c));printf("%u\n", sizeof(+c));printf("%u\n", sizeof(-c));return 0;
}

?%u --- 以十進制的形式打印無符號整數

sizeof(c):毫無疑問結果為1字節,以為c為char類型,char的長度為1字節

sizeof(+c) 和 sizeof(-c):正和負表示算術運算,只要cher類型和short類型的數據參與運算,就會發生整型提升,提升為int類型,所以sizeof(+c) 和 sizeof(-c)計算的結果為4

代碼驗證:?


算術轉換?

何為算術轉換?

如果某個操作符的各個操作數屬于不同的類型(只包括大于等于int類型的類型,也就是說大于等于4個字節),那么除非其中一個操作數的轉換為另一個操作數的類型(向上轉換,小的字節類型轉換為大的字節類型),否則操作就無法進行

舉例說明:?

	double d = 3.14159;int n = 10;d + n;

double類型的dint類型的n 算術運算時,就會把 int類型的n 向上轉換為 double類型?再進行運算

注意:只是在運算時把?int類型的n 向上轉換為 double類型?,并不會改變n的類型

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

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

相關文章

基于SpringBoot實現輕量級的動態定時任務調度

在使用SpringBoot框架進行開發時&#xff0c;一般都是通過Scheduled注解進行定時任務的開發&#xff1a; Component public class TestTask {Scheduled(cron"0/5 * * * * ? ") //每5秒執行一次public void execute(){SimpleDateFormat df new SimpleDateFormat(…

解決 NullReferenceException: Object reference not set to an instance of an object

在 Unity 中 利用 URDF Importer import UR5e_gripper 的 URDF file 時出現錯誤&#xff1a; NullReferenceException: Object reference not set to an instance of an object。 理論上是有個Object 是 Null&#xff0c;當我再次檢查URDF后仍覺得路徑沒有寫錯。 于是我 把Mesh…

軟件測試面試200問(含答案+文檔)

Part1 1、你的測試職業發展是什么&#xff1f; 測試經驗越多&#xff0c;測試能力越高。所以我的職業發展是需要時間積累的&#xff0c;一步步向著高級測試工程師奔去。而且我也有初步的職業規劃&#xff0c;前3年積累測試經驗&#xff0c;按如何做好測試工程師的要點去要求自…

spring的bean注冊

bean注冊 第三方jar包的類想添加到ioc中&#xff0c;加不了Component該怎么辦呢。 可以使用Bean和Import引入jar包&#xff0c;可以使用maven安裝到本地倉庫。 修改bean的名字&#xff1a;Bean("aaa")使用ioc的已經存在的bean對象&#xff0c;如Country&#xff1a;p…

in-flight 要維持在 bdp 附近嗎

試圖在 bbr 和 aimd 之間保持公平是徒勞的&#xff0c;因為它們沒有共識。bbr 認為 in-flight 超過 bdp 是擁塞&#xff0c;而 aimd 認為 buffer 溢出才擁塞&#xff0c;兼顧彼此&#xff0c;就是 bbr3&#xff0c;aimd 不會往左&#xff0c;bbr 就往右。 vegas 同理&#xff…

自定義@AnonymousAccess注解

一.目的&#xff1a; 自定義AnonymousAccess注解&#xff0c;可以直接在controller上添加該注解使請求繞過權限驗證進行匿名訪問&#xff0c;便于快速調用調試以及部分不需要進行安全驗證的接口。而不是每次都需要去SecurityConfig文件中進行修改。 二.流程&#xff1a; 三.實…

通用后臺管理(二)——項目搭建

目錄 前言 一、安裝vue-cli依賴 1、使用yarn下載vue-cli 2、使用npm下載 3、檢查一下是否下載成功 二、創建項目 1、創建項目&#xff0c;my-app是項目名稱 2、 這里選擇vue 2&#xff0c;藍色表示選中的。 3、啟動項目 三、下載項目依賴 四、配置項目 1、修改esli…

VS2019_新建窗體應用文件SOP

文章目錄 1. 打開VS2. 創建新項目3. 選擇Windows窗體應用4. 起名&#xff0c;選位置&#xff0c;框架版本選擇4.5及之后&#xff0c;這里選的4.85. 新建完成 1. 打開VS 2. 創建新項目 3. 選擇Windows窗體應用 注意要選.NET的 4. 起名&#xff0c;選位置&#xff0c;框架版本…

ps aux命令詳解

ps aux 是在 Unix 和 Linux 系統中常用的命令&#xff0c;用于顯示當前系統上運行的所有進程的信息。它結合了多個選項來提供詳細的進程列表。以下是這個命令的詳細解釋&#xff1a; 解釋 ps aux 命令 ps&#xff1a;這是顯示當前系統進程的基本命令。a&#xff1a;顯示與終端…

原來Kimi不是不作為,而是在準備大招!

月之暗面Kimi 作為一款我每天都在使用的AI智能助手&#xff0c;是真正的幫助我解決了不少工作及日常創作的一些事情。 它的表現能力也是毋庸置疑&#xff0c;不論是業內還是普通人&#xff0c;10個人當中可能就有9個人在使用Kimi。 而昨天&#xff08;7月8日&#xff09;Kimi…

Civil3D 2025:工程設計的智慧之友

初識Civil3D 2025 當我第一次打開Civil3D 2025時&#xff0c;仿佛置身于湘西的山水之間&#xff0c;那種熟悉而又新奇的感覺撲面而來。Civil3D 2025不僅僅是一款軟件&#xff0c;它更像是一位老友&#xff0c;帶著溫暖和智慧&#xff0c;陪伴我走過每一個設計的日夜。 功能豐…

侯捷C++面向對象高級編程(上)-9-擴展補充:類模板、函數模板及其他

1.static 2.把 ctors 放在 private 區 3.cout 4.class template、類模板 5.function template、函數模板 6.namespace

DDR3 SO-DIMM 內存條硬件總結(二)

上一節我們大概了解了下DDR3的大概使用情況&#xff0c;下來我們再順藤摸瓜再深入學習下ddr3的使用&#xff0c;我們從下面這張內存條開始&#xff1a; 我們看到第二行2GB 1RX8 PC3-10600S-9-11-B2 具體含義上一節已經講過了&#xff0c;我們深挖下1R*8&#xff0c;他的含義是…

資料分析筆記整理

提升技巧多做題、少動筆、多分析 資料分析認識 國考一般20題(24~28分鐘) 統計材料的類型包括單純的文字、表格、圖形以及由這些元素組成的復合類型材料 文字性材料:(30~60秒) 多段落型文字材料(時間、關鍵詞、結構) 孤立段落文字材料(時間、關鍵詞、標點[。;]) 表…

Java語言程序設計——篇二(2)

Java語言基礎 運算符與表達式運算符1、算術運算符2、關系運算符3、邏輯運算符&#xff08; &&、||、 !、&、| 、^&#xff09;4、位運算符&#xff08; >>、<<、>>>、&、|、^、~&#xff09;5、賦值運算符6、條件運算符7、字符串運算符8、…

數字化時代下,財務共享數據分析建設之路

隨著人工智能、云計算、大數據、區塊鏈等技術&#xff0c;以及衍生出的各種產品的大發展&#xff0c;使得數字化發展的速度再一次加快&#xff0c;也讓數字經濟和數字化轉型得到了更多人的關注和認可。 在傳統經濟增長逐漸放緩&#xff0c;市場競爭愈發激烈的局面下&#xff0…

GOJS去除水印

GOJS gojs 去除水印 **查找go.js庫搜索下面這段文本 String.fromCharCode(a.charCodeAt(g)^b[(b[c]b[d])%256]) 加入這段文本 if(f.indexOf(GoJS 2.1 evaluation)>-1|| f.indexOf(© 1998-2021 Northwoods Software)>-1|| f.indexOf(Not for distribution or produ…

splice方法的使用#Vue3

splice方法的使用 splice(index,len,item)是vue中對數組進行操作的方法之一&#xff0c;可以用來刪除&#xff0c;更新&#xff0c;和增加數組內容 參數: index:數組下標 len&#xff1a;為1或0 item:更新或增加的內容 使用方法&#xff1a; 刪除&#xff0c;當參數形式為spli…

Linux內核網絡性能問題的追蹤(工具篇)

在現代計算環境中&#xff0c;網絡性能對于系統的整體性能至關重要。網絡瓶頸不僅會影響數據傳輸速度&#xff0c;還會影響應用程序的響應時間&#xff0c;最終影響用戶體驗。為了有效地解決網絡性能問題&#xff0c;了解和使用各種追蹤工具至關重要。另外一方面&#xff0c;造…

MySQL批量插入數據的幾種方式

最近在項目中遇到了批量插入數據的一些問題&#xff0c;一般圖省事都是利用mybatis或mybatis-plus的saveBatch方法&#xff0c;但這次因為數據過多&#xff0c;出現了一系列的問題&#xff0c;只能手動處理&#xff0c;接下來分享下對于數據量比較大的批量插入&#xff0c;可能…