結構定義問題... |
尚未結案
|
Sarick
一般會員 發表:14 回覆:19 積分:6 註冊:2004-01-19 發送簡訊給我 |
|
dllee
站務副站長 發表:321 回覆:2519 積分:1711 註冊:2002-04-15 發送簡訊給我 |
ABC 結構占 8 bits = 1 Byte
其中
b0 占 1 bit (LSB)
b1 占 1 bit
b2 占 1 bit
b3 占 1 bit
b4 占 1 bit
b5 占 1 bit
b6 占 1 bit
b7 占 1 bit (MSB) 包大人(RaynorPao.) 補充如下:
引言: (1)佔多少 byte 是看作業系統對 int 的定義 (2)例如 Win32 作業系統的 int 是佔 4 byte (3)以前 DOS 作業系統的 int 是佔 2 byte (4)某些嵌入式系統的 int 是佔 1 byte視動科技 VMASK - ViewMove Automation Software Kernel 發表人 - dllee 於 2004/07/05 20:59:34
------
http://www.ViewMove.com |
Sarick
一般會員 發表:14 回覆:19 積分:6 註冊:2004-01-19 發送簡訊給我 |
|
dllee
站務副站長 發表:321 回覆:2519 積分:1711 註冊:2002-04-15 發送簡訊給我 |
當您有使用 bit field 宣告方式來指定位元時,就表示它占用的位元數是由您指定。所以:
struct ABC
{
int b0 : 2;
int b1 : 2;
int b2 : 2;
int b3 : 2;
}DEF;
都是占 2 bits 沒錯。
不會因作業系統或硬體平台不同而不同。(回應 1 & 3)
而前置的 int 只是對於數值的解釋方式。
在電腦中存資料是以 2 進位方式儲存,如果資料有 N 位元,當宣告成 int (其實最好是宣告成 signed) 則可儲存的資料範圍是:
[-2^(N-1)] ~ [2^(N-1) - 1]
如果是宣告成 unsigned 則可儲存的資料範圍是:
[0] ~ [2^(N) - 1]
所以,如果以您第一次只有 1 bit,那可存的資料是 -1 與 0,即使您存入其他數值,也會變成這兩個值的其中一個,例如:
typedef struct { int b0 : 1; int b1 : 1; int b2 : 1; int b3 : 1; int b4 : 1; int b5 : 1; int b6 : 1; int b7 : 1; }DEF; DEF A; A.b0=1; int Test=A.b0;從程式碼看來好像 A.b0 給了 1 ,再給 Test,所以 Test 應該會是 1, 但您可以去 DEBUG 看看,或是用 IntToStr 用一個 Label 或什麼東西把它轉出來看,會發現 Test 的數值是 -1 而不是 1。 typedef struct { int b0 : 2; int b1 : 2; int b2 : 2; int b3 : 2; }ABC; ABC B; B.b0=1; int Test2=B.b0;以您的第二例,則每個 bX 可存的資料是 -2 ~ 1 所以,Test2 的數值會真的是 1。 以下是以前上課的講義,提供參考: [font=細明體] ■ 第十八章 數字系統與二進碼 電腦只懂 0 與 1 這兩個數值,所有存在硬碟的東西,都是用一堆 0 與 1 來存的, 如:你的電腦作業、圖形資料、文字資料、應用程式、作業系統等等。但是我們所 熟悉的數值並不是只有 0 與 1 ,還有 2、3、4、...、9,而且是十進位的。 什麼是十進位(Decimal)? 十進位有 0,1,2,3,4,5,6,7,8,9 等數值, 9 加 1 會 等於 十,而這個十已經不是 0 ~ 9 所能表示了,所以要進一位,也就是 10 。 同理,什麼是二進位(Binary)? 二進位有 0,1 等數值, 1 加 1 會等於 二, 而這個二已經不是 0 ~ 1 所能表示了,所以要進一位,也就是 ( 10 )b 。 什麼是八進位(Octal)? 八進位有 0,1,2,3,4,5,6,7 等數值, 7 加 1 會等於 八, 而這個八已經不是 0 ~ 7 所能表示了,所以要進一位,也就是 ( 10 )o 。 什麼是十六進位(Hexadecimal)? 十六進位有 0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F 等數值, F 加 1 會等於 十六,而這個十六已經不是 0 ~ F 所能表示了, 所以要進一位,也就是 ( 10 )h 。 ◎ 數字系統(Number System) 十進位系統,是由十個數元(digit),即 0,1,2,3,4,5,6,7,8,9 為基底(Base)的一 套系統。任何一個數字只能用這十個數元來表示,我們也可以說,十進位數字系統 是一套以十為基底的數字系統。同理: K進位系統,是由K個數元,即 0,1,2,...,K-1 。在K進位的數字系統中,其 基底為K,則該系統的任何一個正數(不管是整數或是實數)都可以用一個多項式N 來表示: p-1 1 0 -1 -2 -q N = A K ... A K A K A K A K ... A K p-1 1 0 -1 -2 -q p-1 i = Σ A K , -q ≦ i ≦ p-1 , A 屬於 {0,1,2,...,K-1} i=-q i i 這個以K為基底的數字N,通常寫成 ( p 是整數的位數,q 是小數的位數 ) N = ( A A ~ A A . A A ~ A ) k p-1 p-2 1 0 -1 -2 -q k 例如: 十進位的 567.89 , 567.89 在整數部分有 3 位,小數部分有 2 位: 2 1 0 -1 -2 567.89 = 5*10 6*10 7*10 8*10 9*10 [/font=細明體]視動科技 VMASK - ViewMove Automation Software Kernel 發表人 - dllee 於 2004/07/06 09:27:16
------
http://www.ViewMove.com |
Sarick
一般會員 發表:14 回覆:19 積分:6 註冊:2004-01-19 發送簡訊給我 |
|
dllee
站務副站長 發表:321 回覆:2519 積分:1711 註冊:2002-04-15 發送簡訊給我 |
typedef struct { int b0 : 2; int b1 : 2; int b2 : 2; int b3 : 2; }ABC;前面已經說過,是 2 bits 那可以表示的 int 範圍為 -2 ~ 1 共 4 個數值: -2, -1, 0 , 1 (參考 P.S.) 只要是在此 4 個數值之外的資料指定給它,也一定會變成此 4 個數值之一。 以十進位來說,個位數能放的資料就是 0~9,而 b0 把它想成就是個位數的話,今天即使您把 1234 這個數值存入 b0 那它所能存的也只有其中的個位數,也就是 4。 同理, -3 的 2 進位表示 1111 1111 1111 1101 其最後 2 bits 為 01 所以 b0 就是 1 3 的 2 進位表示 0000 0000 0000 0011 其最後 2 bits 為 11 所以 b0 就是 -1 (您可能又看錯囉...) 您可以使用小算盤的工程模式輸入數值後,選二進位,就可以看到二進位的排列。 P.S. 以 2 bits 資料可表示的數值: 0x00 = 最後2bits 為 00 = 0 0x01 = 最後2bits 為 01 = 1 0x02 = 最後2bits 為 10 = -2 0x03 = 最後2bits 為 11 = -1 視動科技 VMASK - ViewMove Automation Software Kernel 發表人 - dllee 於 2004/07/06 20:54:12
------
http://www.ViewMove.com |
Sarick
一般會員 發表:14 回覆:19 積分:6 註冊:2004-01-19 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |