網站首頁 編程語言 正文
1.什么是整形提升
表達式中的字符和短整形操作數在使用之前被轉換成普通整形
int
,這種轉換叫做整形提升
整形提升針對的類型小于整形的
char
,short
char
占用1字節空間,short
占用2字節空間,在運算時都會提升為占用4個字節的int
類型
所以C的整型算術運算總是至少以缺省整型類型的精度來進行的。換而言之整形算術運算都至少以int
類型計算的
2.為什么會有整形提升
表達式的整形運算要在CPU的相應運算器內執行,CPU內整型運算器(ALU)的操作數的字節長度一般就是int的字節長度,同時也是CPU的通用寄存器的長度。
通用CPU(general-purpose CPU)是難以直接實現兩個8比特字節直接相加運算(雖然機器指令中可能有這種字節相加指令)。所以,表達式中各種長度可能小于int長度的整型值,都必須先轉換為int或unsigned int,然后才能送入CPU去執行運算。
因此,即使兩個char
類型的變量相加,在·CPU執行時實際上也要先轉化為CPU內整型操作數的標準長速度。
3.如何進行整形提升呢?
整形提升是按照變量的數據類型的符號位來提升的
負數的整形提升:
char c1 = -1
,char
類型占1字節,也就是它的二進制補碼只有8個比特位 :1111111
因為char
是有符號位的char
,所以整形提升的時候,高位補符號位1
提升之后的效果為:11111111111111111111111111111111
正數的整形提升:
char c2 = 1;
變量c2的二進制位(補碼)中只有8個比特位:00000001
因為char
為有符號的char
所以整形提升的時候,高位補充符號位,即為0
提升之后的結果是:00000000000000000000000000000001
無符號的整形提升:高位補0
4.整形提升的例子
例1
#include<stdio.h> int main() { char a = 3; char b = 127; char c = a + b; printf("%d\n", c); return 0; }
char a = 3
,首先把3
放到a
中,3是int
類型,3的二進制序列為:00000000000000000000000000000011
需要把3
放到char
中,int
是32個比特位,char
是8個比特位,所以接下來需要進行截斷:將低8個比特位放到char
中,所以此時a
中為:00000011
char b = 127
也是一樣127
為00000000000000000000000001111111
截斷為011111111
char c = a + b
,接下來要進行整型提升
當前char
為有符號的char
,所以對于a
就高位補0
,為:00000000000000000000000000000011
同理,b
整形提升后為:00000000000000000000000001111111
接下來相加為
00000000000000000000000010000010
,將這個32位二進制放到c
中,截斷為10000010
printf("%d\n", c)
中,%d
是打印十進制的數,所以還需整形提升,此時c
為10000010
,符號位為:1
,整形提升高位補1
,最終為11111111111111111111111110000010
(補碼),其原碼為10000000000000000000000001111110
,所以這個數字輸出為-126
輸出結果:
例2
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; }
比較也是表達式,
a
,b
也要發生整形提升,所以只有c
不會整形提升,所以輸為c
輸出結果
這個例子能體現整形提升的存在
例3
int main() { char c = 1; printf("%u\n", sizeof(c)); printf("%u\n", sizeof(+c)); printf("%u\n", sizeof(-c)); return 0; }
c
是char
類型,sizeof(c)
值為1+c
.-c
中,c
都參與計算,所以整形提升為int
類型,sizeof(+c)
,sizeof(-c)
值都為4
輸出結果:
這個例子也能體現整形提升的存在
例4
下面程序輸出什么?
#include <stdio.h> int main() { char a = -128; printf("%u\n",a); return 0; }
- 10000000000000000000000010000000 -128原碼
- 11111111111111111111111101111111 -128反碼
- 11111111111111111111111110000000 -128補碼
- 截斷 10000000 a
- 整形提升11111111111111111111111110000000
- 所以最后輸出11111111111111111111111110000000對應的十進制數,是一個很大的數
例5
下面程序輸出什么?
#include <stdio.h> int main() { char a = 128; printf("%u\n",a); return 0; }
-
10000000000000000000000010000000
?128補碼 - 截斷:
10000000
?a補碼 - 整形提升:
11111111111111111111111110000000
- 所以最后輸出
11111111111111111111111110000000
對應的數,一個很大的數
整形提升是真實存在的,但是我們平時感覺不到他的存在
其他操作符如int
,float
,double
等大于等于int
的操作符,之間的轉換,就要用到算術轉換了
總結
原文鏈接:https://blog.csdn.net/weixin_64116522/article/details/127927688
相關推薦
- 2022-08-15 Python?time模塊之時間戳與結構化時間的使用_python
- 2022-10-01 react使用useState修改對象或者數組的值無法改變視圖的問題_React
- 2022-10-11 MybatisPlus的UpdateWrapper和QueryWrapper的區別
- 2022-07-13 kafka中Topic、消費組以及消息狀態詳解
- 2023-09-18 子組件向父組件傳值的4種方法
- 2024-01-09 setFirstResult ,setMaxResults
- 2023-03-29 react?Table準備Spin?Empty?ConfigProvider組件實現_React
- 2022-12-05 Python異常?ValueError的問題_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支