วิธีการคิดกับตัวเลขจำนวนเต็ม

Category »  จับฉ่ายคอมพิวเตอร์
โดย : Webmaster เมื่อ 30/11/2550 0:01:00
(อ่าน : 25121) 
พี่น้องครับ ... เรื่องของ "ชนิดข้อมูล - Data Type" ล้วนมีความสำคัญเป็นอย่างมากในการออกแบบ หรือ พัฒนาโปรแกรมขึ้นมา อย่างเวลาที่เราจะสร้างฐานข้อมูลขึ้นมาสักตารางก็ต้องไปเกี่ยวข้องกับชนิดข้อมูลแล้ว พอไปเขียนโปรแกรมก็ต้องมีการประกาศตัวแปรชนิดต่างๆอีกนั่นไงล่ะครับ ... พี่น้อง ชนิดของข้อมูลเหล่านี้อาจมีชื่อเรียกที่แตกต่างกันไปในแต่ละตัวแปลภาษา แต่ทั้งนี้ทั้งนั้นมันก็ล้วนแล้วแต่ก่อกำเนิดมาจากรากเหง้า หรือ วิธีการคิดเช่นเดียวกัน ในปัจจุบันนี้ ผมคิด และ ยังเชื่อว่า มีพี่น้องอีกหลายต่อหลายคนที่ยังไม่เคยรู้เรื่องนี้มาก่อน ... แต่ผมไม่ขอสรุปให้ฟังหรอกน่ะว่า "เราจะเข้าใจมันไปทำไม ???" เอาเป็นว่า ... ขอให้พี่น้องนำไปคิดเอาเองล่ะกันครับผม ... ว่าจะนำสิ่งที่รู้ตรงนี้ไปใช้ประโยชน์จากมันอย่างไรได้บ้าง เหอๆๆๆๆ

การหาค่าต่ำสุด และ สูงสุดของเลขจำนวนเต็มขนาด 1 และ 2 ไบต์ แบบไม่คิดเครื่องหมาย
พี่น้อง ... สังเกตเห็นค่าหน่วยความจำ RAM มั้ยครับว่าทำไมมันถึงได้เพิ่มเป็นเท่าตัวตลอด ... เหอๆๆๆๆ
ก็เพราะมันมาจากเลข 2 ยกกำลังเลขจำนวนเต็มใดๆ ที่เรียงต่อๆกันดังภาพด้านบนนี่แหละครับ ... พี่น้อง


เลขจำนวนเต็มขนาด 2 Byte (16 บิต) หรือ Integer (แบบคิดเครื่องหมาย) จะมีค่าระหว่าง -32,768 ถึง +32,767
มันหามาได้ก็เพราะด้วยวิธีการเฉกเช่นนี้ล่ะครับ ... พี่น้อง

ค่าต่ำสุด และ สูงสุด ของเลขจำนวนเต็มขนาด 1 ไบต์ แบบคิดเครื่องหมาย


ตัวอย่างการหาไบนารี่เลข -128
เวลาบวกเลขฐาน 2 ก็อย่างงน่ะครับ ... 1 + 1 = 0 ทด 1 เด้อพี่น้อง


ตัวอย่างการหาไบนารี่เลข -28


ตัวอย่างการหาไบนารี่เลข -129
บทพิสูจน์จากโปรแกรม

โปรแกรมภาษาปาสคาล ทดสอบชนิดของข้อมูล
โปรแกรมภาษาปาสคาล ทดสอบชนิดของข้อมูล

คำตอบที่ได้รับ

จาก No-3 เราพบว่าเมื่อตัวแปร Bytes (ชนิด BYTE แบบไม่คิดเครื่องหมาย) มีค่าเท่ากับ 255 + 1 หรือ 256 แต่ผลที่ได้กลับวนรอบกลับมาที่จุดเริ่มต้นใหม่ ... นั่นคือ 0


นี่คือบทพิสูจน์ ... ผลลัพธ์ที่ได้มันควรจะได้เป็น 256 (ฐาน 10) หรือ 1 0 0 0 0 0 0 0 0 (ฐาน 2) แต่พี่น้องพึงสังเกตว่าเลขจำนวนเต็มขนาด 1 ไบต์ มันสามารถเก็บค่าได้เพียง 8 บิต (บิต 7 - บิต 0 = 8 บิต) ดังนั้นมันจึงเก็บได้เพียงเลข 0 ทั้งหมด 8 ตัว ส่วนตัวทด คือ 1 มันคือบิต 8 (หรือตัวที่ 9) ไม่รู้ว่าเราจะเอามันไปยัดใส่ไว้ตรงไหนน่ะซิ ผลลัพธ์ที่ได้มันก็เลยให้คำตอบมาเป็น 0 อย่างที่เห็นและเป็นอยู่ ... แต่หากพี่น้องต้องการจะคิดตัวทดด้วย ก็จะต้องเปลี่ยนตัวแปรชนิด BYTE ให้กลายเป็นเลขจำนวนเต็มแบบ Integer ขนาด 2 ไบต์แทนไงล่ะคร้าบ ...

โปรแกรมภาษา C++
หรือใช้โปรแกรมภาษา C++

คำตอบของภาษา C++
ผลลัพธ์ที่ได้เหมือนกันล่ะครับ ... พี่น้อง


เมื่อลองนำมาทดสอบกับ MS Visual Basic 6.0
เกิด Run Time Error แบบกระจุ๊กกระจิ๊ก ...
ซึ่งนอกจากจะเรื่องของชนิดข้อมูลแล้ว มันยังมีอีกหลายๆอย่างที่พี่น้องต้องเจอะกับ Bug อันเนื่องมาจากสาเหตุเล็กๆน้อยๆที่มักจะมองข้ามไป


การแก้ไข Bug ... แต่การพัฒนาโปรแกรมจริงๆกว่าจะหา Bug เจอ มันไม่ได้ง่ายดายเช่นนี้น่ะครับ ... พี่น้อง