ฟังก์ชัน printbin
วันนี้ก็อ่านหนังสือสอบวิชา Abstract Data Type แล้วก็เปิดเว็บบอร์ดรุ่นไปพลางๆ ก็เจอ @b4lmung สงสัยว่าผลลัพธ์ที่ได้จากโค้ด printf ต่อไปนี้มันเอาส่วนไหนของ float มา print
#include <stdio.h> int main(){ float a = 10.1F; printf("%d", a); return 0; } |
Result: 1073741824 |
เราก็เกิดอาการสงสัย และเดาว่า มันคงอ่านค่า binary ทั้งดุ้นของ float เป็นแบบ int และพิมพ์ออกมา เราก็เลยลองฟังก์ชัน printbin เพื่อพิมพ์ binary representation ของตัวแปรใดๆ (ดูว่าใน ram มันเก็บเป็นเลขฐานสองยังไง) ได้โค้ดอย่างนี้…
#include <stdio.h> 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<<i) > 0) ? 1 : 0)); } } printf("\n"); } int main(){ float a = 10.1F; printf("%d\n", 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 แล้วมันได้เลขฐานสองถูกต้องตามรูปนี้อ่ะ
ปล2. ลองใช้ฟังก์ชัน printbin เช็คดูว่าจำนวนเต็มติดลบ มันจะเก็บเป็น 2′complements อย่างที่เราเรียนๆ มากันรึเปล่า
ปล3. ช่วงนี้มีแต่ภาษา C และเลขฐานสอง เพราะกำลังจะสอบวิชา Abstract Data Types และ Digital ฮ่าๆ
