C語言之C語言的底層操作

字號:

概述
    C語言的內(nèi)存模型基本上對應(yīng)了現(xiàn)在von Neumann(馮·諾伊曼)計算機(jī)的實際存儲模型,很好的達(dá)到了對機(jī)器的映射,這是C/C++適合做底層開發(fā)的主要原因,另外,C語言適合做底層開發(fā)還有另外一個原因,那就是C語言對底層操作做了很多的的支持,提供了很多比較底層的功能。
    下面結(jié)合問題分別進(jìn)行闡述。
    問題:移位操作
    在運用移位操作符時,有兩個問題必須要清楚:
    (1)、在右移操作中,騰空位是填 0 還是符號位;
    (2)、什么數(shù)可以作移位的位數(shù)。
    答案與分析:
    ">>"和"<<"是指將變量中的每一位向右或向左移動, 其通常形式為:
    右移: 變量名>>移位的位數(shù)
    左移: 變量名<<移位的位數(shù)
    經(jīng)過移位后, 一端的位被"擠掉",而另一端空出的位以0 填補(bǔ),在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 都不合法。
    注意即使騰空位填符號位,有符號整數(shù)的右移也不相當(dāng)與除以 。為了證明這一點,我們可以想一下 -1 >> 1 不可能為 0 。
    問題:位段結(jié)構(gòu)
    struct RPR_ATD_TLV_HEADER
    {
    ULONG res1:6;
    ULONG type:10;
    ULONG res1:6;
    ULONG length:10;
    };