目錄
一、 關于整型提升
二、補充一點
三、如何進行整型提升?
四、實體
五、總結
一、 關于整型提升
1.什么是整型提升?
C語言的整型算術運算總是至少以預設整型型別的精度來進行的,
為了獲得這個精度,運算式中的字符和短整型運算元在使用之前被轉換為普通整型,這種轉換稱為整型提升,
2.整型提升的意義
運算式的整型運算要在CPU的相應運算器件內執行,CPU內整型運算器(ALU)的運算元的位元組長度
一般就是int的位元組長度,同時也是CPU的通用暫存器的長度,
因此,即使兩個char型別的相加,在CPU執行時實際上也要先轉換為CPU內整型運算元的標準長
度,
通用CPU(general-purposeCPU)是難以直接實作兩個8位元位元組直接相加運算(雖然機器指令
中可能有這種位元組相加指令),所以,運算式中各種長度可能小于int長度的整型值,都必須先轉
換為int或unsignedint,然后才能送入CPU去執行運算,
二、補充一點
首先,要了解原碼、反碼、補碼(簡單說一下)
整數二進制表示:有3種
原碼:直接根據數值寫出的二進制序列就是原碼
反碼:原碼的符號位不變,其他位按位取反就是反碼
補碼:反碼加1,就是補碼
補充(對于正整數的原碼、反碼、補碼都相同;負數是存放在二進制的補碼中,負數的原碼、反碼、補碼都不相同)
例如:-1
原碼:10000000 00000000 00000000 00000001
反碼:11111111 11111111 11111111 11111110(按位取反)
補碼:11111111 11111111 11111111 11111111(反碼加1)
三、如何進行整型提升?
1.符號(signed)型別
(1)負數的整型提升
char a = -1;
變數a 的二進制位(補碼)中只有8個位元位:
1111111
因為 char 為有符號的 char
所以整形提升的時候,高位補充符號位,即為1
提升之后的結果是:
11111111111111111111111111111111
(2)正數的整形提升
char b = 1;
變數b 的二進制位(補碼)中只有8個位元位:
00000001
因為 char 為有符號的 char
所以整形提升的時候,高位補充符號位,即為0
提升之后的結果是:
00000000000000000000000000000001
2.無符號(unsigned)整形提升,高位補0
四、實體
#include <stdio.h>
int main()
{
char a = 3;
char b = 127;
char c = a + b;
printf("%d\n", c);
return 0;
}
運行結果是 -126

為什么是-126呢??
1、首先,我們先看a=3是一個整型,占4個位元組,32個bit位;b=127也是如此,占4個位元組
3和127的二進制原碼(整型)
3的原碼:00000000 00000000 00000000 00000011
127的原碼:00000000 00000000 00000000 01111111
int型別是4個位元組,32個bit位,而char型別只能儲存1個位元組,也就是8個bit位,所以char會發生截斷,即選擇32位中的最低位放入char中,也就是后八位
所以3和127在char型別中只能儲存8個bit,如下
3:00000011
127: 01111111
2、接下來a和b是如何相加的呢??
a和b自身的大小都是8個位元位(char型別),沒有達到一個整型的大小(4位元組),在計算時為了能夠提升計算精度,要將a和b整型提升,
整型提升是按照變數的資料型別的符號位來進行提升的,
我們來看a和b,a和b現在是有符號的字符型變數,可以認為最高位的0是它的符號位,高位通通補0,補全32個位元位,
a整型提升前:00000011 //最高位的0是它的符號位
a整型提升后:00000000 00000000 00000000 00000011
b整型提升前:01111111 //最高位的0是它的符號位
b整型提升后:00000000 00000000 00000000 01111111
整型提升后a和吧進行相加,結果為
a+b:00000000 00000000 00000000 10000010
現在要將結果放入c中,而c又是char型,又要發生截斷
c:100000010
3、接下來如何列印呢??
此時還不能直接列印輸出,因為printf函式中是以%d的形式進行列印,又要對c進行整型提升,
c的型別是有符號字符型,最高位1為他的符號位,高位通通補1,補全32個位元位,
c整型提升前:10000010
c整型提升后:11111111 11111111 11111111 10000010
此時c得到的是補碼,還要反推原碼才能列印
c的補碼:11111111 11111111 11111111 10000010
c的反碼:11111111 11111111 11111111 10000001
c的原碼:10000000 00000000 00000000 01111110
接下來就可以列印c了,結果是-126
五、總結
最后,文章就結束了!!!!
如果文章有問題可以私信我!!

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/386657.html
標籤:其他
上一篇:貪心演算法——點燈問題
