




已閱讀5頁,還剩1頁未讀, 繼續(xù)免費閱讀
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
水滴石穿之C語言的底層操作 概述C語言的內存模型基本上對應了現(xiàn)在von Neumann(馮諾伊曼)計算機的實際存儲模型,很好的達到了對機器的映射,這是C/C+適合做底層開發(fā)的主要原因,另外,C語言適合做底層開發(fā)還有另外一個原因,那就是C語言對底層操作做了很多的的支持,提供了很多比較底層的功能。下面結合問題分別進行闡述。問題:移位操作在運用移位操作符時,有兩個問題必須要清楚:(1)、在右移操作中,騰空位是填 0 還是符號位;(2)、什么數(shù)可以作移位的位數(shù)。答案與分析:和移位的位數(shù)左移: 變量名移位的位數(shù)經(jīng)過移位后, 一端的位被擠掉,而另一端空出的位以0 填補,在C語言中的移位不是循環(huán)移動的。(1) 第一個問題的答案很簡單,但要根據(jù)不同的情況而定。如果被移位的是無符號數(shù),則填 0 。如果是有符號數(shù),那么可能填 0 或符號位。如果你想解決右移操作中騰空位的填充問題,就把變量聲明為無符號型,這樣騰空位會被置 0。(2) 第二個問題的答案也很簡單:如果移動 n 位,那么移位的位數(shù)要不小于 0 ,并且一定要小于 n 。這樣就不會在一次操作中把所有數(shù)據(jù)都移走。比如,如果整型數(shù)據(jù)占 32 位,n 是一整型數(shù)據(jù),則 n 31 和 n 0 都合法,而 n 32 和 n 1 不可能為 0 。問題:位段結構 strUCt RPR_ATD_TLV_HEADERULONG res1:6;ULONG type:10;ULONG res1:6;ULONG length:10;位段結構是一種特殊的結構, 在需按位訪問一個字節(jié)或字的多個位時, 位結構比按位運算符更加方便。位結構定義的一般形式為: struct位結構名數(shù)據(jù)類型 變量名: 整型常數(shù);數(shù)據(jù)類型 變量名: 整型常數(shù); 位結構變量;其中: 整型常數(shù)必須是非負的整數(shù), 范圍是015, 表示二進制位的個數(shù), 即表示有多少位。變量名是選擇項, 可以不命名, 這樣規(guī)定是為了排列需要。例如: 下面定義了一個位結構。 structunsigned incon: 8; /*incon占用低字節(jié)的07共8位*/unsigned txcolor: 4;/*txcolor占用高字節(jié)的03位共4位*/unsigned bgcolor: 3;/*bgcolor占用高字節(jié)的46位共3位*/unsigned blink: 1; /*blink占用高字節(jié)的第7位*/ch; 位結構成員的訪問與結構成員的訪問相同。例如: 訪問上例位結構中的bgcolor成員可寫成: ch.bgcolor位結構成員可以與其它結構成員一起使用。 按位訪問與設置,方便&節(jié)省例如: struct infochar name8;int age;struct addr address;float pay;unsigned state: 1;unsigned pay: 1;workers; 上例的結構定義了關于一個工從的信息。其中有兩個位結構成員, 每個位結構成員只有一位, 因此只占一個字節(jié)但保存了兩個信息, 該字節(jié)中第一位表示工人的狀態(tài), 第二位表示工資是否已發(fā)放。由此可見使用位結構可以節(jié)省存貯空間。注意不要超過值限制問題:字節(jié)對齊我在使用VC編程的過程中,有一次調用DLL中定義的結構時,發(fā)覺結構都亂掉了,完全不能讀取正確的值,后來發(fā)現(xiàn)這是因為DLL和調用程序使用的字節(jié)對齊選項不同,那么我想問一下,字節(jié)對齊究竟是怎么一回事?答案與分析:關于字節(jié)對齊:1、 當不同的結構使用不同的字節(jié)對齊定義時,可能導致它們之間交互變得很困難。2、 在跨CPU進行通信時,可以使用字節(jié)對齊來保證唯一性,諸如通訊協(xié)議、寫驅動程序時候寄存器的結構等。三種對齊方式:1、 自然對齊方式(Natural Alignment):與該數(shù)據(jù)類型的大小相等。2、 指定對齊方式 : #pragma pack(8) /指定Align為 8; #pragma pack() /恢復到原先值3、 實際對齊方式: Actual Align = min ( Order Align, Natual Align )對于復雜數(shù)據(jù)類型(比如結構等):實際對齊方式是其成員最大的實際對齊方式: Actual Align = max( Actual align1,2,3,)編譯器的填充規(guī)律:1、 成員為成員Actual Align的整數(shù)倍,在前面加Padding。成員Actual Align = min( 結構Actual Align,設定對齊方式)2、 結構為結構Actual Align的整數(shù)倍,在后面加Padding.例子分析: #pragma pack(8) /指定Align為 8struct STest1char ch1;long lo1;char ch2; test1;#pragma pack() 現(xiàn)在 Align of STest1 = 4 , sizeof STest1 = 12 ( 4 * 3 )test1在內存中的排列如下( FF 為 padding ): 00 - - - 04 - - - 08 - - - 12 - - - 01 FF FF FF 01 01 01 01 01 FF FF FF ch1 - lo1 - ch2 #pragma pack(2) /指定Align為 2 struct STest2 char ch3; STest1 test; test2; #pragma pack()現(xiàn)在 Align of STest1 = 2, Align of STest2 = 2 , sizeof STest2 = 14 ( 7 * 2 )test2在內存中的排列如下: 00 - - - 04 - - - 08 - - - 12 - - - 02 FF 01 FF FF FF 01 01 01 01 01 FF FF FF ch3 ch1 - lo1 - ch2注意事項:1、 這樣一來,編譯器無法為特定平臺做優(yōu)化,如果效率非常重要,就盡量不要使用#pragma pack,如果必須使用,也最好僅在需要的地方進行設置。2、 需要加pack的地方一定要在定義結構的頭文件中加,不要依賴命令行選項,因為如果很多人使用該頭文件,并不是每個人都知道應該pack。這特別表現(xiàn)在為別人開發(fā)庫文件時,如果一個庫函數(shù)使用了struct作為其參數(shù),當調用者與庫文件開發(fā)者使用不同的pack時,就會造成錯誤,而且該類錯誤很不好查。3、 在VC及BC提供的頭文件中,除了能正好對齊在四字節(jié)上的結構外,都加了pack,否則我們編的Windows程序哪一個也不會正常運行。4、 在 #pragma pack(n) 后一定不要include其他頭文件,若包含的頭文件中改變了align值,將產(chǎn)生非預期結果。5、 不要多人同時定義一個數(shù)據(jù)結構。這樣可以保證一致的pack值。問題:按位運算符C語言和其它高級語言不同的是它完全支持按位運算符。這與匯編語言的位操作有些相似。 C中按位運算符列出如下:操作符 作用& 位邏輯與位邏輯或 位邏輯異或- 位邏輯反 右移 左移注意:1、 按位運算是對字節(jié)或字中的實際位進行檢測、設置或移位, 它只適用于字符型和整數(shù)型變量以及它們的變體, 對其它數(shù)據(jù)類型不適用。2、 關系運算和邏輯運算表達式的結果只能是1或0。 而按位運算的結果可以取0或1以外的值。 要注意區(qū)別按位運算符和邏輯運算符的不同, 例如, 若x=7, 則x&8 的值為真(兩個非零值相與仍為非零), 而x&8的值為0。3、 與 ,&與&,與! 的關系&、 和 操作符把它們的操作數(shù)當作一個為序列,按位單獨進行操作。比如:10 & 12 = 8,這是因為&操作符把 10 和 12 當作二進制描述 1010 和 1100 ,所以只有當兩個操作數(shù)的相同位同時為 1 時,產(chǎn)生的結果中相應位才為 1 。同理,10 12 = 14 ( 1110 ),通過補碼運算,10 = -11 ( 11.110101 )。 &、 和!操作符把它們的操作數(shù)當作真或假,并且用 0 代表假,任何非 0 值被認為是真。它們返回
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 航空物流企業(yè)的戰(zhàn)略規(guī)劃與執(zhí)行考核試卷
- 船舶改裝項目施工過程中的質量控制信息化考核試卷
- 現(xiàn)代林業(yè)機械發(fā)展趨勢與挑戰(zhàn)考核試卷
- 紅外測溫儀的制造與優(yōu)化考核試卷
- 玻璃制品表面涂層技術考核試卷
- 墨水生產(chǎn)過程中的自動化設備操作考核試卷
- 眼鏡制造業(yè)的質量控制體系考核試卷
- 租書服務創(chuàng)新案例考核試卷
- 煤炭加工企業(yè)的效益分析與財務評估考核試卷
- 抖音直播帶貨火花支付傭金結算服務協(xié)議
- 2025年高三高考沖刺主題教育班會:《高三考前心理調適指南:減壓賦能 輕松備考》-2024-2025學年高中主題班會課件
- 2025年安全生產(chǎn)考試題庫(消防安全應急處置)消防設施運行維護試題
- 鄂爾多斯市水發(fā)燃氣有限公司招聘筆試真題2024
- 2025年臨海市紀委市監(jiān)委下屬事業(yè)單位公開選聘工作人員1人筆試備考題庫及答案解析
- 河北省唐山市、廊坊市2025年高三高考第二次模擬演練思想政治試卷(含答案)
- 湖北武漢市華中師大一附中2025屆高三3月押軸試題物理試題試卷含解析
- 司法雇員考試題目及答案
- 國家金融監(jiān)督管理總局所屬事業(yè)單位招聘真題2024
- 小學一年級數(shù)學20以內進位、退位加減法口算
- 2024年全國高中數(shù)學聯(lián)賽(浙江預賽)試題含參考答案
- MOOC 理解馬克思-南京大學 中國大學慕課答案
評論
0/150
提交評論