c c 中數的強制型別轉化!!!!!!

2021-06-08 11:29:43 字數 1202 閱讀 9858

在vc6中執行如下**:

#include

int main()

為什麼輸出的結果會是:b=fffffff7, d=67如果將c改為:c=0xffffff87,則結果為:b=fffffff7, d=ffffff87

解釋你這個問題首先要明白幾個概念

1.printf的%x引數的含義:unsigned int;無符號十六進製制表示(無前導0x)也就是說它要求後面給的是乙個unsigned int型,而unsigned int的處理方式就是將實際的32bit輸出,那麼如果後面給的不是unsigned int怎麼辦?那就隱式的型別轉換。

2.c語言如何進行隱式型別轉換?就是將「較低」型別提公升為「較高」型別,相應的較高型別轉換為較低型別要顯示的強制型別轉換。 char *b=(char*)&a就是強制型別轉換。較低型別和較高型別其實就是指占用的儲存空間。而現在許多pc裡unsigned int 和int 都是32bit的(大家可以使用sizeof來看),這樣int 轉換為 unsigned int 其實儲存方面沒有變化,但值就不對了。因為c語言裡int是使用補碼來記錄的,也就是說負數轉換為unsigned int時,就成了其補碼了。關於補碼是什麼參看

3.強制型別轉換的問題。程式中char *b=(char*)&a, *d=(char*)&c;兩個強制型別轉換表示 *b *d 分別是a和c的最後的8bit了,換句話說就算 a=0x000000f7,c=0x00000067;結果也一樣。char預設是有符號的,所以根據以上三點,再看 printf("b=%x, d=%x\n",*b,*d);這句,*b = (char*)&a // 意味著 *b=0xf7 ,由於char有符號,也就是-9,但是char是8bit,轉換為unsigned int 就是-9的補碼fffffff7*d = (char*)&c //意味著 *d=0x67, 由於char有符號,也就是103,但是char是8bit,轉換為unsigned int 就是103的補碼103但當*d=0x87時,由於char有符號,也就是-121,但是char是8bit,轉換為unsigned int 就是-121的補碼0xffffff87

下面把你原來函式改了一下,更清楚一點:

#include

int main()

執行結果:*b= :sizeof 1, int -9, unsigned int 4294967287, hex fffffff7*d= :sizeof 1, int 103, unsigned int 103, hex 67

C C 之型別強制轉化

強制轉化四種型別可能很多人都常常忽略就象我一樣,但是有時還是比較有用的。不了解的建議看看,一些機制我也不是十分了解,只是將一些用法寫出來讓大家看看。2004 11 27 9 00 強制轉化無論從語法還是語意上看,都是c 中最難看的特徵之一。但是基於c風格的轉化的語義的不明確性及其一些潛在問題。強制型...

JavaScript資料型別的強制轉化 數值

下班很無聊 2017 05 24 21 50 一 轉化為數值型別 a 如果是布林值,false為0,true為1 var a true alert number a 1 b 如果是數字,轉化為本身,將無意義的後倒0去掉。var b 1.0 alert number b 1 c 如果null轉化為0 ...

C 強制型別轉化

1 static cast 任何只要具有明確定義的型別轉換,只要不包含底層const就可以使用 static cast 當需要把乙個較大的算數型別賦值給乙個較小的算數型別,static cast非常有用。此時,強制型別轉換告訴程式的讀者和編譯器 我們不在乎潛在的精度損失。一般來說,如果編譯器發現乙個...