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