欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C語言中你不知道的隱式類型轉換規(guī)則詳解

 更新時間:2024年01月29日 09:24:50   作者:庫庫的里昂  
在C語言中,類型轉換的方式一般可分為隱式類型轉換和顯示類型轉換(也稱為強制類型轉換),其中隱式類型轉換由編譯器自動進行,不需要程序員干預,本文給大家詳細介紹了C語言中隱式類型轉換規(guī)則,需要的朋友可以參考下

前言

  • 在 C 語言中,類型轉換的方式一般可分為隱式類型轉換顯示類型轉換(也稱為強制類型轉換)。
  • 其中隱式類型轉換由編譯器自動進行,不需要程序員干預。
  • 隱式類型轉換通常有兩種情況:整形提升算術轉換。

一、隱式類型轉換的規(guī)則

在C語言中,自動類型轉換遵循以下規(guī)則:

  1. 若參與運算量的類型不同,則先轉換成同一類型,然后進行運算。
  2. 轉換按數據長度增加的方向進行,以保證精度不降低。如int型和long型運算時,先把int量轉成long型后再進行運算。
    a、若兩種類型的字節(jié)數不同,轉換成字節(jié)數高的類型
    b、若兩種類型的字節(jié)數相同,且一種有符號,一種無符號,則轉換成無符號類型
  3. 所有的浮點運算都是以雙精度進行的,即使僅含float單精度量運算的表達式,也要先轉換成double型,再作運算。
  4. char型和short型參與運算時,必須先轉換成int型。
  5. 在賦值運算中,賦值號兩邊量的數據類型不同時,賦值號右邊量的類型將轉換為左邊量的類型。如果右邊量的數據類型長度比左邊長時,將丟失一部分數據,這樣會降低精度,丟失的部分按四舍五入向前舍入。

二、整型提升

C的整型算術運算總是至少以缺省整型類型的精度來進行的。

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

1.整型提升的意義

表達式的整型運算要在CPU的相應運算器件內執(zhí)行,CPU內整型運算器(ALU)的操作數的字節(jié)長度。

一般就是int的字節(jié)長度,同時也是CPU的通用寄存器的長度。
因此,即使兩個char類型的相加,在CPU執(zhí)行時實際上也要先轉換為CPU內整型操作數的標準長度。

通用CPU(general-purpose CPU)是難以直接實現(xiàn)兩個8比特字節(jié)直接相加運算(雖然機器指令中可能有這種字節(jié)相加指令)。所以,表達式中各種長度可能小于int長度的整型值,都必須先轉換為int或unsigned int,然后才能送入CPU去執(zhí)行運算。

代碼示例:

char a,b,c;
a = b + c;

b和c的值被提升為普通整型,然后再執(zhí)行加法運算。
加法運算完成之后,結果將被截斷,然后再存儲于a中。

2.如何進行整體提升?

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

2.1正數的整形提升

高位補充符號位,即補0

char c2 = 1;
變量c2的二進制位(補碼)中只有8個比特位:
00000001
因為 char 為有符號的 char //VS中默認char為有符號char
所以整形提升的時候,高位補充符號位,即為0
提升之后的結果是:
00000000000000000000000000000001

2.2負數的整型提升

高位補充符號位,即補1

char c1 = -1;
變量c1的二進制位(補碼)中只有8個比特位:
1111111
因為 char 為有符號的 char
所以整形提升的時候,高位補充符號位,即為1
提升之后的結果是:
11111111111111111111111111111111

2.3無符號整型提升

高位補0

3.整型提升實例

代碼示例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;
}

代碼結果:

c

結果分析:

實例1中的a,b要進行整形提升,但是c不需要整形提升
a,b整形提升之后,變成了負數,所以表達式 a0xb6 , b0xb600的結果是假,但是c不發(fā)生整形提升,則表達式 c==0xb6000000 的結果是真.

代碼示例2:

#include<stdio.h>
int main()
{
	char c = 1;
	printf("c=%u\n", sizeof(c));//%u按無符號整形unsigned int打印
	printf("c=%u\n", sizeof(+c));
	printf("c=%u\n", sizeof(-c));
	return 0;
}

c=1
c=4
c=4

實例2中的,c只要參與表達式運算,就會發(fā)生整形提升,表達式 +c ,就會發(fā)生提升,所以 sizeof(+c) 是4個字節(jié)。
表達式 -c 也會發(fā)生整形提升,所以 sizeof(-c) 是4個字節(jié),但是 sizeof© ,就是1個字節(jié)。

三、算術轉換

如果某個操作符的各個操作數屬于不同的類型,那么除非其中一個操作數的轉換為另一個操作數的類型,否則操作就無法進行。下面的層次體系稱為尋常算術轉換。

//排名由高到低
long double
double
float
unsigned long int
long int
unsigned int
int

如果某個操作數的類型在上面這個列表中排名較低,那么首先要轉換為另外一個操作數的類型后執(zhí)行運算。

警告:
但是算術轉換要合理,要不然會有一些潛在的問題。

代碼示例:

如果某個操作數的類型在上面這個列表中排名較低,那么首先要轉換為另外一個操作數的類型后執(zhí)行運算。

警告:
但是算術轉換要合理,要不然會有一些潛在的問題。

代碼示例:

#include<stdio.h>
int main()
{
	float f = 3.14;
    int num = f;//隱式轉換,會有精度丟失
	printf("num=%d",num);
}

代碼結果:

num=3

結果分析:

在賦值運算過程中,當兩邊的數據類型不一樣時,右邊的數據將強制轉換為左邊的數據,即float類型的b將強制轉會為int類型,小數點后面的部分直接丟棄,導致精度下降。

小結

以上就是C語言中你不知道的隱式類型轉換規(guī)則詳解的詳細內容,更多關于C語言隱式類型轉換規(guī)則的資料請關注腳本之家其它相關文章!

相關文章

  • 介紹C語言中tolower函數的實例

    介紹C語言中tolower函數的實例

    這篇文章主要介紹了介紹C語言中tolower函數的實例,本文列出了該函數的頭文件,功能說明等,以及如何使用,以下就是詳細內容,需要的朋友可以參考下
    2021-07-07
  • VC++ 自定義控件的建立及使用方法

    VC++ 自定義控件的建立及使用方法

    這篇文章主要介紹了VC++ 自定義控件的建立及使用方法的相關資料,十分的詳細,需要的朋友可以參考下
    2015-06-06
  • C/C++自主分配出現(xiàn)double free or corruption問題解決

    C/C++自主分配出現(xiàn)double free or corruption問題解決

    這篇文章主要為大家介紹了C/C++出現(xiàn)double free or corruption問題解決,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-04-04
  • C++ 超詳細快速掌握二叉搜索樹

    C++ 超詳細快速掌握二叉搜索樹

    從這篇博客開始,我就要和大家介紹有關二叉搜索樹的知識,它還衍生出了兩棵樹——AVL樹和紅黑樹,在后面兩篇博客我都會介紹。今天先從二叉搜索樹開始引入
    2022-03-03
  • c++中的stack和dequeue解析

    c++中的stack和dequeue解析

    這篇文章主要介紹了c++中的stack和dequeue介紹,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-05-05
  • Qt設計與實現(xiàn)軟鍵盤效果

    Qt設計與實現(xiàn)軟鍵盤效果

    這篇文章主要為大家詳細介紹了Qt設計與實現(xiàn)軟鍵盤效果的相關知識,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下
    2024-11-11
  • OpenCV利用霍夫變換實現(xiàn)交通車道線檢測

    OpenCV利用霍夫變換實現(xiàn)交通車道線檢測

    經典霍夫變換用來檢測圖像中的直線,后來霍夫變換經過擴展可以進行任意形狀物體的識別,例如圓和橢圓。本文就來利用霍夫變換實現(xiàn)交通車道線檢測,需要的可以參考一下
    2022-09-09
  • 關于"引用"的幾點說明介紹

    關于"引用"的幾點說明介紹

    引用聲明完畢后,相當于目標變量名有兩個名稱,即該目標原名稱和引用名,且不能再把該引用名作為其他變量名的別名
    2013-09-09
  • C++圖解單向鏈表類模板和iterator迭代器類模版詳解

    C++圖解單向鏈表類模板和iterator迭代器類模版詳解

    這篇文章主要為大家詳細介紹了C++圖解單向鏈表類模板和iterator迭代器類模版,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-02-02
  • C++類型轉換和IO流操作處理教程

    C++類型轉換和IO流操作處理教程

    這篇文章主要給大家介紹了關于C++類型轉換和IO流操作處理的相關資料,標準C++為了加強類型轉換的可視性,引入了四種命名的強制類型轉換操作符,文中給出了詳細的代碼示例,需要的朋友可以參考下
    2023-08-08

最新評論