ฟังก์ชัน printbin

วันนี้ก็อ่านหนังสือสอบวิชา Abstract Data Type แล้วก็เปิดเว็บบอร์ดรุ่นไปพลางๆ ก็เจอ @b4lmung สงสัยว่าผลลัพธ์ที่ได้จากโค้ด printf ต่อไปนี้มันเอาส่วนไหนของ float มา print

#include 
int main(){
      float a = 10.1F;
      printf("%d", a);
      return 0;
}
Result:
1073741824

เราก็เกิดอาการสงสัย และเดาว่า มันคงอ่านค่า binary ทั้งดุ้นของ float เป็นแบบ int และพิมพ์ออกมา เราก็เลยลองฟังก์ชัน printbin เพื่อพิมพ์ binary representation ของตัวแปรใดๆ (ดูว่าใน ram มันเก็บเป็นเลขฐานสองยังไง) ได้โค้ดอย่างนี้…

#include 
void printbin(char *c, int bytes)
{  // author: nattster.siamdev.net
  int i, j;
  char a;
  for(j=bytes-1; j>=0; j--)
  {
    a = c[j];
    for(i=sizeof(char)*8-1; i>=0; i--)
    {
      printf("%d", (((a & 1< 0) ? 1 : 0));
    }
  }
  printf("n");
}
int main(){
  float a = 10.1F;
  printf("%dn", a);
  printbin((char*)&a, sizeof(float));
  return 0;
}
Result:
1073741824
01000001001000011001100110011010

เลขฐานสองยาวๆ อันล่างเป็น binary representation ของ 10.1F ตามมาตรฐาน IEEE754-1985 พอลองแปลงเลขฐานสองก้อนนี้กลับไปเป็นฐานสิบมันได้ = 1092721050 ซึ่งคลาดเคลื่อนจากผลที่ได้จาก printf(“%d”, a); นิดหน่อย สรุปว่าเราก็ยังไม่รู้อยู่ดีว่า printf มันเอาอะไรออกมาพิมพ์

แต่! ได้ฟังก์ชัน printbin เอาไว้ใช้เป็นของเล่นในอนาคต เผื่ออยากดูว่าตัวแปรอื่นๆ มันเก็บข้อมูลใน memory ยังไง

ปล. คิดว่าฟังก์ชันทำงานถูกต้องแล้วนะ เพราะลองใส่เลข 0.15625 แล้วมันได้เลขฐานสองถูกต้องตามรูปนี้อ่ะ

IEEE754 representation of 0.15625 (Ref: wikipedia.org)
IEEE754 representation of 0.15625 (Ref: wikipedia.org)

ปล2. ลองใช้ฟังก์ชัน printbin เช็คดูว่าจำนวนเต็มติดลบ มันจะเก็บเป็น 2’complements อย่างที่เราเรียนๆ มากันรึเปล่า

ปล3. ช่วงนี้มีแต่ภาษา C และเลขฐานสอง เพราะกำลังจะสอบวิชา Abstract Data Types และ Digital ฮ่าๆ

ใส่ความเห็น

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / เปลี่ยนแปลง )

Twitter picture

You are commenting using your Twitter account. Log Out / เปลี่ยนแปลง )

Facebook photo

You are commenting using your Facebook account. Log Out / เปลี่ยนแปลง )

Google+ photo

You are commenting using your Google+ account. Log Out / เปลี่ยนแปลง )

Connecting to %s