-> On Sun, 25 Jul 1999 21:14:08 +0700 (JAVT),
  -> "Mohamad Syafi'i" <[EMAIL PROTECTED]>
  -> in message ::: [programming] Operasi Bit. ::: wrote,

  >> typedef union {
  >>         struct {
  >>               unsigned char a:4;
  >>               unsigned char b:4;
  >>         }byte;
  >>         unsigned char c;
  >> } word;
  >> 
  >> Kalau di C/ANSI C (HP-UX) maka a merupakan 4 bit lsb (least significant
  >> bit) dan b merupakan 4 bit msb (most significant bit).
  >> 
  >> Kalau di C Compiler Linux, maka a merupakan 4 bit msb(most significant
  >> bit) dan b merupakan 4 bit lsb (least significant bit).
  >> 
  >> Lalu manakah yang standard C ?????, apakah yang C/ANSI C for HP-UX atau C
  >> Compiler pada Linux yang notabene adalah gcc (yang standard ANSI juga)
  >> ????

Ini bukan masalah compiler, tapi masalah addressing memory. Pada
processor Intel addressing memory menggunakan Little Endian, sedangkan 
di HP (PA-RISC ?) pake Big Endian. Sebenarnya Endian ini cuma mengatur
byte ordering dalam satu word (4 bytes), tapi untuk alasan
fleksibilitas waktu membaca data dari memory, bit ordering dalam byte
juga diatur sesuai dengan endiannya. 

Big endian 

   MSB .... LSB   MSB .... LSB  MSB .... LSB  MSB .... LSB
      byte 3         byte 2        byte 1        byte 0


Little  endian

   LSB .... MSB   LSB .... MSB  LSB .... MSB  LSB .... MSB
      byte 3         byte 2        byte 1        byte 0

Cuma seperti anda terbalik, pada processor Intel semestinya yang MSB
adalah b, bukan a. Sedangkan di PA-RISC yang MSB adalah a dan bukan b.
Silakan coba jalankan test program di bawah ini,

typedef struct{
  unsigned char a0:1;
  unsigned char a1:1;
  unsigned char a2:1;
  unsigned char a3:1;
  unsigned char a4:1;
  unsigned char a5:1;
  unsigned char a6:1;
  unsigned char a7:1;
} mybyte;

mybyte x;

int main(){
  *(char *)&x = 1;
  printf("%d %d %d %d %d %d %d %d\n", 
         x.a0,x.a1,x.a2,x.a3,x.a4,x.a5,x.a6,x.a7);

  *(char *)&x = 128;
  printf("%d %d %d %d %d %d %d %d\n", 
         x.a0,x.a1,x.a2,x.a3,x.a4,x.a5,x.a6,x.a7);
}

Saya ada test di Intel (little endian) dan SPARC (big endian)

Jika dijalankan di Intel, maka hasilnya adalah
1 0 0 0 0 0 0 0
0 0 0 0 0 0 0 1
yang berarti a7 adalah MSBlebih belakang lebih significant).

Sedangkan di SPARC
0 0 0 0 0 0 0 1
1 0 0 0 0 0 0 0
yang berarti a0 adalah MSB (lebih depan lebih significant)


--
niko



--------------------------------------------------------------------------------
Utk berhenti langganan, kirim email ke [EMAIL PROTECTED]
Informasi arsip di http://www.linux.or.id/milis.php3
Pengelola dapat dihubungi lewat [EMAIL PROTECTED]
Hosted by http://www.Indoglobal.com

Kirim email ke