CodeQuiz EP.19 - ทำไมจำนวนเต็มใน C/C++ ถึงมากที่่สุดที่ 2^31 - 1

วิชาการความรู้

พี่ปาล์ม ชิติพัทธ์

เผยแพร่เมื่อ

อัปเดตล่าสุดเมื่อ

Blog Cover ทำไมจำนวนเต็มใน C/C++ ถึงมากสุดแค่ 2^31-1

📌 สาระสำคัญ

  • คอมพิวเตอร์เก็บข้อมูลในรูปแบบ เลขฐานสอง (Binary) เช่น 110, 1010
  • ในคอมพิวเตอร์ เราเรียกแต่ละหลักของเลขฐานสองว่า bit
  • ค่าสูงสุดของจำนวนเต็ม 2^31 - 1 = 2,147,483,647
  • วิธีการใช้บิตซ้ายสุดเก็บเครื่องหมาย เรียกว่า Sign Magnitude

🤖เกริ่นเล็ก ๆ น้อย ๆ

ในคอมของเราจะเก็บเลขต่าง ๆ เอาไว้ในรูปแบบ "เลขฐานสอง (Binary)" และรับบเลขปกติที่เราใช้อยู่ทุกวันคือ "เลขฐานสิบ"

ตัวอย่าง 6 และ 18 ในเลขฐานสอง

latex-image.png

ในทางคอมพิวเตอร์เราจะเรียกว่า bits เช่น 110 มี 3 หลักเรียกว่า 3 bits

Note ไว้ว่า: 1 byte = 8 bits
และส่วนใหญ่เราใช้ byte ในการบอกว่า โปรแกรม, ไฟล์ หรือ ตัวแปร อะไรสักอย่างมีขนาดเท่าไหร่

เราลองให้ตัวแปรของเรามีขนาด 3 bits (ยกตัวอย่างง่ายดี) เราจะได้ว่า

04_biggestInt.png

ทีนี้เรารู้แล้วว่าถ้าเรามี 3 bits ค่าที่เป็นไปได้ทั้งหมดคือ 0 ถึง 7 แล้วถ้าเรามี n bits ล่ะเราจะได้ว่า

06_biggestInt.png

🔍ไขข้อสงสัย

หลังจากที่เราได้ปูพื้นฐานแล้วว่าถ้าจำนวน bit ของเราเพิ่มมากขึ้นค่าที่เป็นไปได้ก็จะเพิ่มมากขึ้น

มาดูจำนวนเต็มในภาษา C/C++ กันเรารู้แล้วว่าคอมจะเก็บข้อมูลในจำนวนของ byte และจำนวนเต็ม(int)ในภาษา C/C++ จะเก็บได้แค่ 4 bytes หรือ 32 bits นั้นเอง

ถ้าอย่างงั้นค่าสูงสุดที่เป็นไปได้คือ 2^32 - 1 น่ะสิ งั้นทำไมค่าสูงสุดคือ 2^31 - 1 ล่ะ

จริง ๆ แล้วแล้วเราจำเป็นต้องใช้ 1 bit ตัวซ้ายที่สุดเอาไว้เก็บเครื่องหมาย +, - ยังไงล่ะ

latex-image2.png
Note: การแทนจำนวนลบด้วยการเอา bit ซ้ายสุดมาเป็นแทนเครื่องหมายเรียกว่า Sign magnitude ซึ่งจริง ๆ ในทางปฏิบัติจะใช้อีกแบบนึงแบบโดยพื้นฐานแล้วแบบนี้เข้าใจง่ายดี

เพราะฉะนั้นเราได้ว่าค่าสูงสุดของเราคือ 2^31 - 1 และค่าต่ำสุดคือ -2^31 - 1 ( จริง ๆ ค่าต่ำสุดตรงนี้ต้องบอกไว้ก่อนว่ามันคือ 2^31 แต่เพื่อกันสับสนเอาเป็นว่าเอาแบบนี้ไปก่อน 555555 )


บทความที่เกี่ยวข้อง