小端模式與強(qiáng)制數(shù)據(jù)類型轉(zhuǎn)換_第1頁
小端模式與強(qiáng)制數(shù)據(jù)類型轉(zhuǎn)換_第2頁
小端模式與強(qiáng)制數(shù)據(jù)類型轉(zhuǎn)換_第3頁
小端模式與強(qiáng)制數(shù)據(jù)類型轉(zhuǎn)換_第4頁
小端模式與強(qiáng)制數(shù)據(jù)類型轉(zhuǎn)換_第5頁
全文預(yù)覽已結(jié)束

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

小端模式與強(qiáng)制數(shù)據(jù)類型轉(zhuǎn)換先從一個問題說開去C++數(shù)據(jù)類型轉(zhuǎn)換的問題viewplain#include<iostream.h>voidmain()13.{inti=0xb62;charc;c=i;cout<<c<<endl;}這里為什么輸出的是b?先檢測一下我們所使用的電腦的CPU的字節(jié)序版本一(有問題,結(jié)果無論如何都是34,不能說明34是高地址的還是低地址的)ttinclude"stdafx.h"intmain(intargc,char*argu[])'//printf("HelloWorld*\n");inti=0x1234;charc=(char)i;printf("c^xXn",c);return0;~C:\DOCUIEHTSABDSETTIIGS\CE123\^S\11\Debug\l1.exec=34Pressmykeytocontinue—版本二(根據(jù)shineyan1991的留言修改后得到的,在此謝謝shineyan1991的建議)^include'stdaFx.h"±ntitain(Li>tarqc,tzhar*argti[])inta■0x123<i;chMb=*(char*)&a;〃通過將Mt強(qiáng)制類型轉(zhuǎn)換成6邳單字節(jié),磷干a的低地址部分'如果h等priRtFC^xXo";財;oTJ:\Dncmenl.^udS?tVlLXDebiicV]!1.mb34Pi*esskeptocentinue從上圖可知,CPU的字節(jié)序是小端模式。知識點(diǎn)小端模式(Little-Endian)數(shù)據(jù)類型中的高位數(shù)據(jù)存放于高地址部分,低位數(shù)據(jù)存放于低地址部分。簡而言之:高位在后,低位在前。大端模式(Big-Endian)數(shù)據(jù)類型中的高位數(shù)據(jù)存放于低地址部分,低位數(shù)據(jù)存放于高地址部分。簡而言之:高位在前,低位在后。初步分析0xb62是十六進(jìn)制,因?yàn)閏har是一個字節(jié)的,所以我們只取低8位(丟棄了高字節(jié),而保留了低字節(jié)),這是和語言有關(guān),和CPU的架構(gòu)無關(guān),一個十六進(jìn)制位轉(zhuǎn)換為4個二進(jìn)制位,所以,低8位就是62轉(zhuǎn)換的,就是01100010,傳遞給char后,char的值就是98,根據(jù)ASCII,就會輸出b0強(qiáng)制數(shù)據(jù)類型轉(zhuǎn)化強(qiáng)制類型轉(zhuǎn)換是通過類型轉(zhuǎn)換運(yùn)算來實(shí)現(xiàn)的。其一般形式為:(類型說明符)(表達(dá)式)其功能是把表達(dá)式的運(yùn)算結(jié)果強(qiáng)制轉(zhuǎn)換成類型說明符所表示的類型。自動轉(zhuǎn)換是在源類型和目標(biāo)類型兼容以及目標(biāo)類型廣于源類型時發(fā)生一個類型到另一類的轉(zhuǎn)換。當(dāng)操作數(shù)的類型不同,而且不屬于基本數(shù)據(jù)類型時,經(jīng)常需要強(qiáng)制類型轉(zhuǎn)換,將操作數(shù)轉(zhuǎn)化為所需要的類型。強(qiáng)制類型轉(zhuǎn)換具有兩種形式,稱為顯式強(qiáng)制轉(zhuǎn)換和隱式強(qiáng)制類型轉(zhuǎn)換。4.1.顯式強(qiáng)制類型轉(zhuǎn)換顯式強(qiáng)制類型轉(zhuǎn)換需要使用強(qiáng)制類型轉(zhuǎn)換運(yùn)算符,格式如下:type(<expression>)或(type)<expression>其中,type為類型描述符,如int,float等。<expression>為表達(dá)式。經(jīng)強(qiáng)制類型轉(zhuǎn)換運(yùn)算符運(yùn)算后,返回一個具有type類型的數(shù)值,這種強(qiáng)制類型轉(zhuǎn)換操作并不改變操作數(shù)本身,運(yùn)算后操作數(shù)本身未改變,例如:viewplainintnVar=0xab65;charcChar=char(nVar);上述強(qiáng)制類型轉(zhuǎn)換的結(jié)果是將整型值0xab65的高端兩個字節(jié)刪掉,將低端兩個字節(jié)的內(nèi)容作為char型數(shù)值賦值給變量cChar,而經(jīng)過類型轉(zhuǎn)換后nVar的值并未改變。4.2.隱式強(qiáng)制類型轉(zhuǎn)換隱式類型轉(zhuǎn)換發(fā)生在賦值表達(dá)式和有返回值的函數(shù)調(diào)用表達(dá)式中。在賦值表達(dá)式中,如果賦值符左右兩側(cè)的操作數(shù)類型不同,則將賦值符右邊操作數(shù)強(qiáng)制轉(zhuǎn)換為賦值符左側(cè)的類型數(shù)值后,賦值給賦值符左側(cè)的變量。在函數(shù)調(diào)用時,如果return后面表達(dá)式的類型與函數(shù)返回值類型不同,則在返回值時將return后面表達(dá)式的數(shù)值強(qiáng)制轉(zhuǎn)換為函數(shù)返回值類型后,再將值返回,如:viewplainintnVar;doubledVar=3.88;nVar=dVar;//執(zhí)行本句后,nVar的值為3,而dVar的值仍是3.884.3.在使用強(qiáng)制轉(zhuǎn)換時應(yīng)注意以下問題:類型說明符和表達(dá)式都必須加括號(單個變量可以不加括號),如把(int)(x+y)寫成(int)x+y則成了把x轉(zhuǎn)換成int型之后再與y相加了。無論是強(qiáng)制轉(zhuǎn)換或是自動轉(zhuǎn)換,都只是為了本次運(yùn)算的需要而對變量的數(shù)據(jù)長度進(jìn)行的臨時性轉(zhuǎn)換,而不改變數(shù)據(jù)說明時對該變量定義的類型。如果一個運(yùn)算符兩邊的運(yùn)算數(shù)類型不同,先要將其轉(zhuǎn)換為相同的類型,即較低類型轉(zhuǎn)換為較高類型,然后再參加運(yùn)算,轉(zhuǎn)換規(guī)則如下圖所示。double?float高TlongTunsignedTint?char,short低圖中橫向箭頭表示必須的轉(zhuǎn)換,如兩個float型數(shù)參加運(yùn)算,雖然它們類型相同,但仍要先轉(zhuǎn)成double型再進(jìn)行運(yùn)算,結(jié)果亦為double型。縱向箭頭表示當(dāng)運(yùn)算符兩邊的運(yùn)算數(shù)為不同類型時的轉(zhuǎn)換,如一個long型數(shù)據(jù)與一個int型數(shù)據(jù)一起運(yùn)算,需要先將int型數(shù)據(jù)轉(zhuǎn)換為long型,然后兩者再進(jìn)行運(yùn)算,結(jié)果為long型。所有這些轉(zhuǎn)換都是由系統(tǒng)自動進(jìn)行的,使用時你只需從中了解結(jié)果的類型即可。這些轉(zhuǎn)換可以說是自動的,但然,C語言也提供了以顯式的形式強(qiáng)制轉(zhuǎn)換類型的機(jī)制。當(dāng)較低類型的數(shù)據(jù)轉(zhuǎn)換為較高類型時,一般只是形式上有所改變,而不影響數(shù)據(jù)的實(shí)質(zhì)內(nèi)容,而較高類型的數(shù)據(jù)轉(zhuǎn)換為較低類型時則可能有些數(shù)據(jù)丟失。當(dāng)賦值運(yùn)算符兩邊的運(yùn)算對象類型不同時,將要發(fā)生類型轉(zhuǎn)換,轉(zhuǎn)換的規(guī)則是:把賦值運(yùn)算符右側(cè)表達(dá)式的類型轉(zhuǎn)換為左側(cè)變量的類型。C語言賦值時的類型轉(zhuǎn)換形式可能會使人感到不精密和不嚴(yán)格,因?yàn)椴还鼙磉_(dá)式的值怎樣,系統(tǒng)都自動將其轉(zhuǎn)為賦值運(yùn)算符左部變量的類型。而轉(zhuǎn)變后數(shù)據(jù)可能有所不同,在不加注意時就可能帶來錯誤。這確實(shí)是個缺點(diǎn),也遭到許多人們批評。但不應(yīng)忘記的是:c面言最初是為了替代匯編語言而設(shè)計的,所以類型變換比較隨意。當(dāng)然,用強(qiáng)制類型轉(zhuǎn)換是一個好習(xí)慣,這樣,至少從程序上可以看出想干什么。5.int-—>char類型轉(zhuǎn)化時的內(nèi)存操作當(dāng)我們把一個int型強(qiáng)制轉(zhuǎn)化為byte時,由于byte只有1個字節(jié),而int型是4個字節(jié),這樣就會產(chǎn)生截斷,int把它最低的內(nèi)存空間里的值放到了byte所對應(yīng)的內(nèi)存空間里。如圖所示:charint*********************1Byte*<*1Byte*低位********************|*1Byte*高位**********|深入分析開始的問題內(nèi)存地址是由上到下有從左至右依次遞增的,小端字節(jié)序指低字節(jié)位數(shù)據(jù)存放在內(nèi)存低地址處,高字節(jié)位數(shù)據(jù)存放在內(nèi)存高地址處;大端字節(jié)序是高字節(jié)數(shù)據(jù)存放在低地址處,低字節(jié)數(shù)據(jù)存放在高地址處。x86的CPU體系結(jié)構(gòu)中,就是使用小端字節(jié)序,即低字節(jié)數(shù)據(jù)存放在低地址處,高字節(jié)數(shù)據(jù)存放在高地址處。將int型的數(shù)據(jù)轉(zhuǎn)化成char型的數(shù)據(jù)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論