目錄
- 傳統藝能😎
- 過渡區🤣
- 正片開始👀
- 運算式求值👏
- 隱式型別轉換👏
- 方法👏
- 算術轉換👏
傳統藝能😎
小編是大一菜鳥不贅述,歡迎大佬指點江山(QQ:1319365055)
此前博客點我!點我!請搜索博主 【知曉天空之藍】點我!點我!請搜索博主 【知曉天空之藍】或掃碼進入!
喬喬的gitee代碼庫(打灰人 )歡迎訪問,點我!

(https://blog.51cto.com)感謝支持!
過渡區🤣
現在是北京時間14:50,大無語的一天,昨天生日嗨晚了,本來定了今早6點30的鬧鐘,但傳統藝能鬧鐘君開始整爛活兒變啞炮,捱到十點起來,人都麻了,尋思日程擠緊一點不想耽誤晚上的刷題時間,

正片開始👀
##補充:結構體👏
結構體變數的宣告需要在主函式之上或者主函式中宣告,如果在主函式之下則會報錯,而且c語言中的結構體不能直接進行強制轉換,只有結構體指標才能進行強制轉換,
涉及結構體的運算子這里講兩個:
. (結構體訪問運算子)
-> ()
首先寫一段代碼:
int main()
{
struct Stu s = {"me",19,60};
prinft("%s %d %lf",s.who,s.age,s.weight)
return 0;
}
這就是個結構體訪問,這里的結構是:結構體變數 . 結構體成員,箭頭怎么用呢?當我有一個結構體指標:
struct Stu * ps = &s;
printf("%s %d %lf\n"),(*ps).name,(*ps).age,(*ps).score);
return 0;
這里我是對 ps 解參考一下,找到他所指向的物件,其實和上面第一組代碼的結果是一樣的;但是,橫看豎看都覺得有點啰嗦,我們把格局打開:
printf("%s %d %lf\n",ps->name,ps->age,ps->score);
return 0;
這樣是不是看著要清爽許多?->運算子的基本語法是:結構體指標 -> 結構體成員
運算式求值👏
我們在接觸那么多的運算子后,就可以應用來進行計算,運算式求值的順序一部分是由運算子的優先級和綜合性決定,同樣,有些運算式的運算元在求值程序可能需要轉換成其他型別,
隱式型別轉換👏
C語言的整型算術運算總是至少以預設整型型別的精度來進行的,為了獲取這個精度,運算式中的字符和短整型運算元在使用之前被轉換為普通整型,這種轉換被稱為整型提升
意義:
運算式的整型運算要在CPU的相應運算器件內執行,CPU內整型運算器(ALU)的運算元的位元組長度一般就是int的位元組長度,同時也是CPU的通用暫存器的長度,因此,即使兩個char型別的相加,在CPU執行時實際上也要先轉換為CPU內整型運算元的標準長度,通用CPU(general-purpose CPU)是難以直接實作兩個8位元位元組直接相加運算(雖然機器指令中可能有這種位元組相加指令),所以,運算式中各種長度可能小于int長度的整型值,都必須先轉換為int或unsigned int,然后才能送入CPU去執行運算,
我們用一段代碼代入一下:
int main()
{
char a = 5;
char b = 126;
char = a+b;
printf("%d\n",c);
return 0;
}
這里的一個運算式:a+b, 其中a和b的型別都是 char 型別,按照定義來看,也就是這段代碼的運行遠比我們想象的復雜 ,我們知道 sizeof(char),sizeof(short)的大小肯定是小于 int 型別的,所以我們計算時就要把char,short提升成 int(unsigned int)型別,再執行運算,
方法👏
整型提升是按照變數的資料型別的符號位來提升的,char x = -1 中,x的二進制位(補碼)只有8個位元位,char為有符號的char所以整型提升時,高位補充符號位,即為1;無符號整型提升,高位補0,
就拿剛剛的代碼進行剖析:
int main()
{
char a = 5;
//5 = 0000……0101(32位)
//char型別一個位元組8個位元位,就只能從5的二進制數中獲取8位
//即a=00000101
//這一步叫截斷
char b = 126;
//126 = 0000……01111110(32位)
//b = 01111110
char = a+b;
//當a,b相加時整型提升
//111111111……0000011
//111111111……0000010
//100000000……1111101(符號位不變,其他位按位取反)=-125
printf("%d\n",c);//
return 0;
下面這個代碼就可以證明整型提升的存在:
int main()
{
char c= 1;
printf("%u\n",sizeof(c));
printf("%u\n",sizeof(+c));
printf("%u\n",sizeof(-c));
return 0;
}

從運行結果來看,為什么會是 4 呢?其實就是因為他參與了運算,進行了整型提升,變成了int型別,
算術轉換👏
我們在剛剛談的是 char 和 short 的計算,那如果是int 和 long ,int 和long long,int 和 float 以及 double計算呢?他們發生的就是算術轉換,總的來說就是4位元組以下的屬于整型提升,大于4的屬于算術轉換,
是指如果其中運算子的各個運算元為不同型別,除非其中一個轉換成另一個型別,否則無法進行操作,下面層次的系統稱為尋常算術轉換
char
short
int
long
long long
float
double
short a = 10;
int b = 5;
prinft("%d\n",sizeof(a+b+1));
printf 結果是 2 ,是因為short只有兩個位元組大小,在運算式中 short a 當家做主,不管放什么進來都是short,但是,sizeof 內部多運算式其實不會真實計算,我們寫檔案通常是 test.c,要生成 .exe 的可執行檔案三步走:編譯,鏈接,運行,在運算式進去在編譯的時候就變成 2 了,根本到不了運行,
如果某個數型別在上表中排名較低,那會首先轉換到另一個運算元的型別后執行運算,
PS.算術轉換要合理,不然會出現潛在問題,
比如把 float 型別變成 int 型別就會造成精度丟失,
今天就到這里,摸了家人們,
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/357167.html
標籤:其他
