線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1344
推到 Plurk!
推到 Facebook!

結構定義問題...

尚未結案
Sarick
一般會員


發表:14
回覆:19
積分:6
註冊:2004-01-19

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-07-05 20:28:01 IP:210.202.xxx.xxx 未訂閱
請教各位前輩 , 下面ㄉ定義結構意思是什麼ㄋ?? struct ABC { 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; 感激您ㄉ不吝指導!!
dllee
站務副站長


發表:321
回覆:2519
積分:1711
註冊:2002-04-15

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-07-05 20:51:33 IP:211.76.xxx.xxx 未訂閱
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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-07-06 08:45:43 IP:210.202.xxx.xxx 未訂閱
感謝前輩, 那請問下面是不是就是說 1.b0到b3都是占2 Bits 2.那前面ㄉint意義在哪裡ㄋ??是不是全看作業系統ㄉ定義ㄋ?? 3.這樣說起來,是不是如果在WIN32下使用下面ㄉCode就是代表b0到b3都是占8Bits?? struct ABC { int b0 : 2; int b1 : 2; int b2 : 2; int b3 : 2; }DEF; 小弟笨拙請不吝指教!!
dllee
站務副站長


發表:321
回覆:2519
積分:1711
註冊:2002-04-15

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-07-06 09:21:42 IP:220.139.xxx.xxx 未訂閱
當您有使用 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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-07-06 10:04:21 IP:210.202.xxx.xxx 未訂閱
拜謝!!     如果前輩不嫌煩,小弟能否再問     typedef struct { int b0 : 2; int b1 : 2; int b2 : 2; int b3 : 2; }ABC;      ABC B;   B.b0=-3; //為什麼這裡會變成B.b0是1 但是如果 B.b0=3 就變成B.b0=-2ㄋ??   int Test2=B.b0;
dllee
站務副站長


發表:321
回覆:2519
積分:1711
註冊:2002-04-15

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-07-06 20:52:54 IP:211.76.xxx.xxx 未訂閱
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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-07-07 09:18:08 IP:210.202.xxx.xxx 未訂閱
感謝版主大大熱心指導!! 小弟感激不盡!!
系統時間:2024-04-26 7:32:00
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!