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

C語言強制類型轉(zhuǎn)換規(guī)則實例詳解

 更新時間:2022年06月02日 10:34:28   作者:qq_43133135  
強制類型轉(zhuǎn)換是把變量從一種類型轉(zhuǎn)換為另一種數(shù)據(jù)類型,下面這篇文章主要給大家介紹了關(guān)于C語言強制類型轉(zhuǎn)換的相關(guān)資料,文中通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下

整形之間的強制轉(zhuǎn)換

在強制類型轉(zhuǎn)換中,我們常用的整形強制轉(zhuǎn)換有無符號和有符號類型的強制轉(zhuǎn)換。所以首先我們得介紹一下計算機中存儲數(shù)字的方式,計算機中通常以補碼的形式來存儲數(shù)據(jù),以8位數(shù)據(jù)為例,二進(jìn)制與有符號數(shù)的對應(yīng)關(guān)系為:

012127-128-127-1
0000 00000000 00010000 00100111 11111000 00001000 00011111 1111

無符號轉(zhuǎn)有符號

012127128129255
0000 00000000 00010000 00100111 11111000 00001000 00011111 1111

所以對于有符號數(shù),首先最高位是正負(fù)的標(biāo)志位。要將無符號數(shù)強制轉(zhuǎn)化為有符號數(shù)時,其內(nèi)存上的二進(jìn)制是不會改變的,只是我們對它的解釋變了,即無符號數(shù)128強制轉(zhuǎn)化有符號數(shù)即-128。

當(dāng)然這樣引申出來的一種好處就是對于有符號數(shù)的判斷,如

char a;
...
if((a>=0)&&(a<80))
{
....
}

可以使用強制轉(zhuǎn)化,省去一個判斷條件

char a;
...
if( ((unsigned char)a) < 80)
{
....
}

有符號轉(zhuǎn)無符號

將有符號數(shù)變成無符號數(shù)時,情況也類似,如8位的有符號數(shù)120轉(zhuǎn)無符號也是120,但8位的-1轉(zhuǎn)無符號則為255。所以當(dāng)我們在有符號數(shù)的計算中,想保留大于等于0的數(shù),不能通過強制轉(zhuǎn)化來完成,必須得加判斷:

char a,b,d;
unsigned char c;
....
c=(unsigned char)(a+b);  (×):當(dāng)運算結(jié)果小于0時c會異常,變成超級大數(shù)

d=a+b;
c = (d<0)?0:d;           (√)

不同長度數(shù)字轉(zhuǎn)化中的截斷

比如我有一個8位的有符號數(shù)-1,要轉(zhuǎn)換為一個16位的有符號數(shù),那么結(jié)果仍舊是-1。首先我們要明確一點,那就是雖然8位的有符號數(shù)-1的二進(jìn)制原本1111 1111,但載入32位的cpu中運算時,它將轉(zhuǎn)化為32位的有符號數(shù)進(jìn)行運算,即int類型的-1。所以對于char類型的數(shù)據(jù),即使運算結(jié)果超過了該類型,其實也不會發(fā)生異常:

char a=127,b=127,c=127,e;
int d;
....
e=a+b+c;   	 (×):當(dāng)運算結(jié)果超過存儲類型的表示范圍時,會因截斷產(chǎn)生錯誤
d=a+b+c;     (√):32位的int類型足夠存儲結(jié)果。

所以我們?nèi)绻巡煌L度的數(shù)字進(jìn)行類型轉(zhuǎn)換,只有兩個步驟:

1、將該數(shù)表示為32位
2、將32位數(shù)截斷為結(jié)果類型

不過,可以確定的一點就是,進(jìn)行第一步時,數(shù)的值不會發(fā)生變化:

比如8位有符號數(shù)-1(1111 1111)將轉(zhuǎn)化為32位的-1(1111 1111 1111 1111 … 1111 111)。
而8位的無符號數(shù)255(1111 1111)轉(zhuǎn)為32位時,也仍舊是255:(0000 0000…0000 0000 1111 111)。

但進(jìn)行第二步轉(zhuǎn)換時,值會由于截斷而發(fā)生變化,而這個截斷一般是高位截斷(舍棄高位,保留低位):

如int類型的255(0000 0000 … 0000 0000 1111 1111)轉(zhuǎn)化為8為的unsigned char類型時,前面的0將被截斷,只保留低8位,即255(1111 1111),當(dāng)然,若是轉(zhuǎn)為8為的有符號char類型,則為-1(1111 1111)。截斷是二進(jìn)制層面的位數(shù)截斷,與實際值無關(guān)。

整形與浮點數(shù)的強制類型轉(zhuǎn)換

我們都知道浮點數(shù)float類型一般遵循ieee754標(biāo)準(zhǔn),有符號位,階碼和尾數(shù):

與整形相同,符號位是1時代表負(fù)數(shù),是0則為正數(shù)。而階碼代表小數(shù)點在哪兒,類似于科學(xué)計數(shù)法100會被表示為 1.0 × 10^2。詳細(xì)的這里不介紹了,我們重點放在強制轉(zhuǎn)化上:

對于一個int類型的數(shù),只要在浮點數(shù)的表示范圍內(nèi),便可以正確的轉(zhuǎn)為浮點數(shù)格式。

但是對于一個浮點類型的數(shù),在轉(zhuǎn)化為整形時,則會只保留整數(shù)位,如:

int a= (int)0.1;    即a=0
int a= (int)1.1;    即a=1
int a= (int)1.5;    即a=1
int a= (int)-1.5;   即a=-1

所以如果要四舍五入之類的的,則不能靠強制轉(zhuǎn)換,得用相關(guān)的函數(shù)。當(dāng)然若是轉(zhuǎn)為其他整形,則結(jié)果將有32位的整形結(jié)果進(jìn)行截斷得到。

當(dāng)然,強制轉(zhuǎn)換和 floor 這個函數(shù)的功能其實很像,floor函數(shù)的功能是向下取整:

int a= floorf(0.1);    即a=0
int a= floorf(1.1);    即a=1
int a= floorf(1.5);    即a=1

對于大于0的浮點數(shù),他倆其實可以替換,而當(dāng)小于0時,他倆區(qū)別很大:

int a= floorf(-0.1);    即a=-1
int a= floorf(-1.1);    即a=-2

int a=(int)-0.1;        即a=0
int a=(int)-1.1;        即a=-1

強制轉(zhuǎn)化的結(jié)果,會產(chǎn)生正負(fù)0這種概念,如-0.9到0.9強制轉(zhuǎn)化結(jié)果都為0。使用強制轉(zhuǎn)化時會產(chǎn)生越界輸出

總結(jié)

到此這篇關(guān)于C語言強制類型轉(zhuǎn)換規(guī)則的文章就介紹到這了,更多相關(guān)C語言強制類型轉(zhuǎn)換內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C語言實現(xiàn)彈跳小球項目

    C語言實現(xiàn)彈跳小球項目

    這篇文章主要為大家詳細(xì)介紹了C語言實現(xiàn)彈跳小球項目,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • c++核心編程之函數(shù)的重載

    c++核心編程之函數(shù)的重載

    這篇文章主要介紹了c++核心編程之函數(shù)的重載,函數(shù)可以重復(fù)使用,提高了復(fù)用性,但前提是必須在一個作用域并且函數(shù)名稱相同,下面附代碼詳細(xì)介紹,需要的小伙伴可以參考一下
    2022-03-03
  • C++合并二叉樹的思路與示例代碼

    C++合并二叉樹的思路與示例代碼

    二叉樹大家應(yīng)該都不陌生,但是合并二叉樹呢?這篇文章主要給大家介紹了關(guān)于C++合并二叉樹的相關(guān)資料,文中給出了兩種解決的方法,大家可以根據(jù)需要選擇對應(yīng)的方法,需要的朋友可以參考下
    2021-08-08
  • C++中replace()?函數(shù)的基本用法

    C++中replace()?函數(shù)的基本用法

    今天就跟大家聊聊有關(guān)C++中replace()函數(shù)的作用是什么,可能很多人都不太了解,為了讓大家更加了解,這篇文章主要給大家介紹了關(guān)于C++中replace()?函數(shù)的基本用法,需要的朋友可以參考下
    2021-11-11
  • C++設(shè)計模式之觀察者模式

    C++設(shè)計模式之觀察者模式

    這篇文章主要介紹了C++設(shè)計模式之觀察者模式,本文講解了什么是觀察者模式、觀察者模式的UML類圖、觀察者模式的使用場合等內(nèi)容,需要的朋友可以參考下
    2014-10-10
  • C++實現(xiàn)LeetCode(112.二叉樹的路徑和)

    C++實現(xiàn)LeetCode(112.二叉樹的路徑和)

    這篇文章主要介紹了C++實現(xiàn)LeetCode(112.二叉樹的路徑和),本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • 詳解C++設(shè)計模式編程中對狀態(tài)模式的運用

    詳解C++設(shè)計模式編程中對狀態(tài)模式的運用

    這篇文章主要介紹了C++設(shè)計模式編程中對狀態(tài)模式的運用,狀態(tài)模式允許一個對象在其內(nèi)部狀態(tài)改變時改變它的行為,對象看起來似乎修改了它的類,需要的朋友可以參考下
    2016-03-03
  • C++常用的#include頭文件總結(jié)

    C++常用的#include頭文件總結(jié)

    這篇文章主要介紹了C++常用的#include頭文件,對初學(xué)者理解C++程序設(shè)計大有好處的相關(guān)資料
    2014-07-07
  • C語言?動態(tài)內(nèi)存管理全面解析

    C語言?動態(tài)內(nèi)存管理全面解析

    動態(tài)內(nèi)存是相對靜態(tài)內(nèi)存而言的。所謂動態(tài)和靜態(tài)就是指內(nèi)存的分配方式。動態(tài)內(nèi)存是指在堆上分配的內(nèi)存,而靜態(tài)內(nèi)存是指在棧上分配的內(nèi)存,本文帶你深入探究C語言中動態(tài)內(nèi)存的管理
    2022-02-02
  • C++單例模式為何要實例化一個對象不全部使用static

    C++單例模式為何要實例化一個對象不全部使用static

    這篇文章主要介紹了C++單例模式為何要實例化一個對象不全部使用static,文基于C++圍繞主題展開詳細(xì)內(nèi)容,需要的小伙伴可以參考一下
    2022-05-05

最新評論