網(wǎng)站首頁 編程語言 正文
整形之間的強(qiáng)制轉(zhuǎn)換
在強(qiáng)制類型轉(zhuǎn)換中,我們常用的整形強(qiáng)制轉(zhuǎn)換有無符號(hào)和有符號(hào)類型的強(qiáng)制轉(zhuǎn)換。所以首先我們得介紹一下計(jì)算機(jī)中存儲(chǔ)數(shù)字的方式,計(jì)算機(jī)中通常以補(bǔ)碼的形式來存儲(chǔ)數(shù)據(jù),以8位數(shù)據(jù)為例,二進(jìn)制與有符號(hào)數(shù)的對應(yīng)關(guān)系為:
0 | 1 | 2 | … | 127 | -128 | -127 | … | -1 |
---|---|---|---|---|---|---|---|---|
0000 0000 | 0000 0001 | 0000 0010 | … | 0111 1111 | 1000 0000 | 1000 0001 | … | 1111 1111 |
無符號(hào)轉(zhuǎn)有符號(hào)
0 | 1 | 2 | … | 127 | 128 | 129 | … | 255 |
---|---|---|---|---|---|---|---|---|
0000 0000 | 0000 0001 | 0000 0010 | … | 0111 1111 | 1000 0000 | 1000 0001 | … | 1111 1111 |
所以對于有符號(hào)數(shù),首先最高位是正負(fù)的標(biāo)志位。要將無符號(hào)數(shù)強(qiáng)制轉(zhuǎn)化為有符號(hào)數(shù)時(shí),其內(nèi)存上的二進(jìn)制是不會(huì)改變的,只是我們對它的解釋變了,即無符號(hào)數(shù)128強(qiáng)制轉(zhuǎn)化有符號(hào)數(shù)即-128。
當(dāng)然這樣引申出來的一種好處就是對于有符號(hào)數(shù)的判斷,如
char a; ... if((a>=0)&&(a<80)) { .... }
可以使用強(qiáng)制轉(zhuǎn)化,省去一個(gè)判斷條件
char a; ... if( ((unsigned char)a) < 80) { .... }
有符號(hào)轉(zhuǎn)無符號(hào)
將有符號(hào)數(shù)變成無符號(hào)數(shù)時(shí),情況也類似,如8位的有符號(hào)數(shù)120轉(zhuǎn)無符號(hào)也是120,但8位的-1轉(zhuǎn)無符號(hào)則為255。所以當(dāng)我們在有符號(hào)數(shù)的計(jì)算中,想保留大于等于0的數(shù),不能通過強(qiáng)制轉(zhuǎn)化來完成,必須得加判斷:
char a,b,d;
unsigned char c;
....
c=(unsigned char)(a+b); (×):當(dāng)運(yùn)算結(jié)果小于0時(shí)c會(huì)異常,變成超級(jí)大數(shù)
d=a+b;
c = (d<0)?0:d; (√)
不同長度數(shù)字轉(zhuǎn)化中的截?cái)?/h3>
比如我有一個(gè)8位的有符號(hào)數(shù)-1,要轉(zhuǎn)換為一個(gè)16位的有符號(hào)數(shù),那么結(jié)果仍舊是-1。首先我們要明確一點(diǎn),那就是雖然8位的有符號(hào)數(shù)-1的二進(jìn)制原本1111 1111,但載入32位的cpu中運(yùn)算時(shí),它將轉(zhuǎn)化為32位的有符號(hào)數(shù)進(jìn)行運(yùn)算,即int類型的-1。所以對于char類型的數(shù)據(jù),即使運(yùn)算結(jié)果超過了該類型,其實(shí)也不會(huì)發(fā)生異常:
char a=127,b=127,c=127,e;
int d;
....
e=a+b+c; (×):當(dāng)運(yùn)算結(jié)果超過存儲(chǔ)類型的表示范圍時(shí),會(huì)因截?cái)喈a(chǎn)生錯(cuò)誤
d=a+b+c; (√):32位的int類型足夠存儲(chǔ)結(jié)果。
所以我們?nèi)绻巡煌L度的數(shù)字進(jìn)行類型轉(zhuǎn)換,只有兩個(gè)步驟:
1、將該數(shù)表示為32位
2、將32位數(shù)截?cái)酁榻Y(jié)果類型
不過,可以確定的一點(diǎn)就是,進(jìn)行第一步時(shí),數(shù)的值不會(huì)發(fā)生變化:
比如8位有符號(hào)數(shù)-1(1111 1111)將轉(zhuǎn)化為32位的-1(1111 1111 1111 1111 … 1111 111)。
而8位的無符號(hào)數(shù)255(1111 1111)轉(zhuǎn)為32位時(shí),也仍舊是255:(0000 0000…0000 0000 1111 111)。
但進(jìn)行第二步轉(zhuǎn)換時(shí),值會(huì)由于截?cái)喽l(fā)生變化,而這個(gè)截?cái)嘁话闶歉呶唤財(cái)啵ㄉ釛壐呶唬A舻臀唬?/p>
如int類型的255(0000 0000 … 0000 0000 1111 1111)轉(zhuǎn)化為8為的unsigned char類型時(shí),前面的0將被截?cái)啵槐A舻?位,即255(1111 1111),當(dāng)然,若是轉(zhuǎn)為8為的有符號(hào)char類型,則為-1(1111 1111)。截?cái)嗍嵌M(jìn)制層面的位數(shù)截?cái)啵c實(shí)際值無關(guān)。
整形與浮點(diǎn)數(shù)的強(qiáng)制類型轉(zhuǎn)換
我們都知道浮點(diǎn)數(shù)float類型一般遵循ieee754標(biāo)準(zhǔn),有符號(hào)位,階碼和尾數(shù):
與整形相同,符號(hào)位是1時(shí)代表負(fù)數(shù),是0則為正數(shù)。而階碼代表小數(shù)點(diǎn)在哪兒,類似于科學(xué)計(jì)數(shù)法100會(huì)被表示為 1.0 × 10^2。詳細(xì)的這里不介紹了,我們重點(diǎn)放在強(qiáng)制轉(zhuǎn)化上:
對于一個(gè)int類型的數(shù),只要在浮點(diǎn)數(shù)的表示范圍內(nèi),便可以正確的轉(zhuǎn)為浮點(diǎn)數(shù)格式。
但是對于一個(gè)浮點(diǎn)類型的數(shù),在轉(zhuǎn)化為整形時(shí),則會(huì)只保留整數(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
所以如果要四舍五入之類的的,則不能靠強(qiáng)制轉(zhuǎn)換,得用相關(guān)的函數(shù)。當(dāng)然若是轉(zhuǎn)為其他整形,則結(jié)果將有32位的整形結(jié)果進(jìn)行截?cái)嗟玫健?/p>
當(dāng)然,強(qiáng)制轉(zhuǎn)換和 floor 這個(gè)函數(shù)的功能其實(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的浮點(diǎn)數(shù),他倆其實(shí)可以替換,而當(dāng)小于0時(shí),他倆區(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
強(qiáng)制轉(zhuǎn)化的結(jié)果,會(huì)產(chǎn)生正負(fù)0這種概念,如-0.9到0.9強(qiáng)制轉(zhuǎn)化結(jié)果都為0。使用強(qiáng)制轉(zhuǎn)化時(shí)會(huì)產(chǎn)生越界輸出
總結(jié)
原文鏈接:https://blog.csdn.net/qq_43133135/article/details/122883705
相關(guān)推薦
- 2022-05-02 C/C++的文件IO函數(shù)你知道嗎_C 語言
- 2023-05-03 C++11學(xué)習(xí)之包裝器解析_C 語言
- 2022-04-03 C++從匯編的視角審視對象的創(chuàng)建問題_C 語言
- 2022-12-11 React?狀態(tài)的不變性實(shí)例詳解_React
- 2022-12-24 C語言中的逗號(hào)運(yùn)算符詳解_C 語言
- 2023-07-22 macos通過homebrew安裝多版本node
- 2023-04-01 C++11中強(qiáng)類型枚舉的使用_C 語言
- 2023-01-15 PyQt5+QtChart繪制散點(diǎn)圖_python
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支