【C基礎】整形提升與算數轉換

一條正弦~發表於2020-10-06

在C語言中尤其要注意隱式型別轉換、整形提升與算數轉換

1、表示式求值

  決定表示式求值的順序:操作符的優先順序結合性

  但是在表示式的運算元在求值的過程中可能需要轉換為其他型別,因此提出隱式型別轉換的概念。

2、隱式型別轉換

  C的整型算術運算總是至少以預設整型型別的精度來進行的。
  為了獲得這個精度,表示式中的字元和短整型運算元在使用之前被轉換為普通整型,這種轉換稱為整型提升

2.1 整型提升的意義

  • CPU內整型運算器(ALU)的運算元的位元組長度一般就是int的位元組長度,同時也是CPU的通用暫存器的長度

  • 因此,即使兩個char型別的相加,在CPU執行時實際上也要先轉換為CPU內整型運算元的標準長度

  • 所以,表示式中各種長度可能小於int長度的整型值,都必須先轉換為int或unsigned int,然後才能送入CPU去執行運算

2.2 例項

#include<stdio.h>
int main()
{
	char a=3;
	char b=127;
	char c=a+b;
	printf("%d\n",c);
	return 0;
}

  結果是130嗎? 答案並不是

image-20201006194437370

  正確結果應該是:-126

  分析

image-20201006210901597

image-20201006210952609

2.3 如何整形提升

  整型提升是按照變數的資料型別的符號位來提升的

image-20201006213336172

2.4 算數轉換

  如果某個操作符的各個運算元屬於不同的型別,那麼其中一個運算元必須轉換為另一個運算元的型別,否則操作就無法進行。

  尋常算數轉換

long double
double
float
unsinged long int 
long int 
unsigned int
int
//由下至上精度越來越高

  如果某個運算元的型別在上面這個列表中排名較低,那麼首先要轉換為另外一個運算元的型別後執行運算(注意:不合理的算數轉換,可能會導致精度丟失)

相關文章