ชนิดข้อมูลในภาษา C# (ตอนจบ)

ไปหน้าแรก | สารบัญ | Laploy.comระเบียนบทความ | บทความจากลาภลอย

ชนิดข้อมูลในภาษา C# (ตอนจบ)

ผู้เขียน : ลาภลอย วานิชอังกูร (laploy.com) 

อ่านเรื่องซับซ้อนก้าวหน้ากันมามากแล้ว วันนี้มาดูเรื่องพื้นฐานใกล้ๆ ตัวที่ต้องพบเจอกันทุกวันบ้าง ในบทความชุดนี้จะนำเสนอเรื่องของหน่วยความจำ การอ้างแอดเดรส และชนิดข้อมูลในภาษา C# กันหน่อย เพราะเป็นเรื่องสำคัญในการเขียนโปรแกรมจัดการข้อมูลและโครงสร้างข้อมูลทุกแบบ บทความนี้มีสามตอน นี้คือตอนที่สามซึ่งเป็นตอนจบ

 

อีกไม่กี่วันผู้เขียนก็ต้องเข้ารับตำแหน่งในงานใหม่ ทำให้ต้องเดินทาง พบปะผู้คน และเรียนรู้สิ่งใหม่ๆ อีกมาก อาจทำให้ไม่มีเวลาอัพบล็อกไปสักพัก  ดังนั้นวันนี้จึงหาเวลามาบล็อกตอนจบของซีรีส์เรื่อง "ชนิดข้อมูลในภาษา C#" ตอนสุดท้ายกันเสียที

 

การอ้างหน่วยความจำ
การอ้างหน่วยความจำหรือ memory addressing หมายถึงการระบุตำแหน่งของหน่วยความจำ (แรมในคอมพิวเตอร์) เพื่อบอกให้ตัวแปลภาษารู้ว่าเราจะเอาอะไรไปเก็บที่ไหน เนื่องจากภาษา C# มีลักษณะ managed code ทำให้ปรกติเราจะไม่เขียนอ่านหน่วยความจำโดยตรง แต่จะให้ CLR และระบบปฏิบัติการจัดการให้โดยอัตโนมัติ ที่ผู้เขียนหยิบยกเรื่องนี้มาพูด เพราะการการรู้ว่าการอ้างหน่วยความจำเป็นอย่างไรก็เป็นสิ่งที่น่าสนใจและจะช่วยให้เห็นภาพรวมของโครงสร้างข้อมูลได้ดี

ลองจินตนาการว่าหน่วยความจำคือแถวของกล่องที่แบ่งเป็นกลุ่มๆ ละแปดใบ วางเรียงกันไม่มีที่สิ้นสุด กล่องแต่ละใบเก็บได้เฉพาะเลขศูนย์หรือหนึ่ง มีหมายเลขที่ไม่ซ้ำกันกำกับกล่องใบแรกของแต่ละกลุ่มไว้ (กลุ่มหนึ่งมีแปดใบคือที่เก็บข้อมูลแปดบิตหรือหนึ่งไบต์) ตัวเลขเหล่านี้คือตัวเลขสำหรับอ้างตำแหน่งของหน่วยความจำ (memory address)

 


รูปที่เห็นข้างบนเป็นตัวอย่างหน่วยความจำที่หนึ่งตำแหน่งเก็บข้อมูลได้หนึ่งไบต์ หรือแปดบิต เป็นเรื่องสำคัญมาก ที่คุณจะต้องรำลึกถึงสิ่งนี้ไว้ตลอดเวลา เมื่อเรียนเรื่องโครงสร้างข้อมูล มิฉะนั้นคุณจะสับสนได้โดยง่าย ให้นึกเสียว่าหน่วยความจำหนึ่งตำแหน่งคือกล่องแปดกล่อง แต่ละกล่องเก็บข้อมูลได้แปดชิ้น

 

เราอ้างถึงตำแหน่งของกล่องเหล่านี้ได้ทั้งโดยตรงและโดยอ้อม ยกตัวอย่างเช่น เราบอกคอมพิวเตอร์ว่าเราต้องการจะคัดลอกข้อมูลจากหน่วยความจำที่ตำแหน่ง 423 นั่นคือเราการอ้างถึงกล่องที่มีเลขประจำตำแหน่ง 423 คอมพิวเตอร์ก็จะไปที่ตำแหน่ง 423 แล้วคัดลอกข้อมูลจากกล่องนั้น แล้วไล่ไปอีกเจ็ดกล่อง กล่องเจ็ดกล่องที่อยู่ถัดจากตำแหน่ง 423 ไม่มีหมายเลขประจำตำแหน่ง นั่นคือกล่องเหล่านี้ใช้หมายเลขประจำตำแหน่งร่วมกับกล่องที่ 423

 

ตำแหน่งจริงของหน่วยความจำ
ผู้เขียนระบุตัวเลขที่ใช้อ้างตำแหน่งหน่วยความจำที่กล่าวถึงในบทนี้โดยใช้ตัวเลขฐานสิบมาตลอด เช่น กล่องใบที่ 423 แต่ในความเป็นจริงแล้ว การอ้างตำแหน่งหน่วยความจำคอมพิวเตอร์เราจะใช้เลขฐานสิบหก (Hexadecimal) เป็นตัวเลขที่มีขนาด 32 หรือ 64 บิต ขึ้นอยู่กับระบบปฏิบัติการที่ใช้ (เช่นใน Windows XP จะเป็น 32 บิต แต่ใน Windows XP64 จะเป็น 64 บิต)

เลขฐานสิบหกก็คล้ายคลึงกับเลขฐานสองและฐานสิบ ในแง่ที่ว่ามันถูกใช้เพื่อการนับ และการกระทำทางคณิตศาสตร์ได้ ตัวเลขที่ใช้ในระบบเลขฐานสิบหกมีจำนวนสิบหกตัว คือจาก 0 ถึง 9 และ A ถึง F ซึ่งใช้แทนที่ 10 ถึง 15 ยกตัวอย่างเช่น ถ้าตำแหน่งของหน่วยความในเลขฐานสิบเป็น 258,425,506 จะเขียนเป็นเลขฐานสิบหกได้ว่า 0x0F6742A2

 

 

ตารางเปรียบเทียบระหว่างเลขฐานสิบ สิบหก และเลขฐานสอง

 

สาเหตุที่เราใช้เลขฐานสิบหกเพราะต้องการเขียนเลขฐานสองแบบย่อ เพื่อให้เราเองอ่านและเขียนได้ง่ายขึ้น และที่สำคัญคือตัวแปลภาษา C# ไม่สนับสนุนการป้อนเลขฐานสอง เมื่อต้องการทำงานกับเลขฐานสองหรือทำงานในระดับบิต เราจึงจำเป็นต้องใช้เลขฐานสิบหกแทน ยกตัวอย่างเช่นเราต้องการอ้างถึงตำแหน่งหน่วยความจำที่ 0000 1000 0001 0010 เขียนเป็นเลขฐานสองแบบนี้ยาวเกินไปและเขียนผิดได้ง่าย เราจึงเขียนเป็นเลขฐานสิบหกแทนได้ว่า 0x0812 ซึ่งมีความหมายดังนี้

    • 0x คือหมายเหตุในภาษา C# บอกให้รู้ว่าจำนวนต่อไปนี้เป็นเลขฐานสิบหก
    • 0000 ในเลขฐานสองเท่ากับ 0 ในเลขฐานสิบหก
    • 1000 ในเลขฐานสองเท่ากับ 8 ในเลขฐานสิบหก
    • 0001 ในเลขฐานสองเท่ากับ 1 ในเลขฐานสิบหก
    • 0010 ในเลขฐานสองเท่ากับ 2 ในเลขฐานสิบหก

 

ชนิดข้อมูลกับการอ้างหน่วยความจำ
ในส่วนต้นๆ ของบทนี้คุณได้เรียนรู้ว่า เราสามารถจองหน่วยความจำได้โดยการระบุชนิดข้อมูล ชนิดข้อมูลบางประเภทจะจองเนื้อที่ในหน่วยความจำมากกว่าหนึ่งไบต์ ยกตัวอย่างเช่นข้อมูลชนิด short ในภาษา C# ที่จะจองเนื้อที่สองไบต์ในหน่วยความจำ (คือ 16 บิต)

เนื่องจากพื้นที่ในหน่วยความจำแต่ละไบต์ มีหมายเลขระบุตำแหน่งของตนเอง คุณจึงอาจจะคิดว่า ถ้าเช่นนั้นแบบข้อมูลชนิด short ก็คงจะมีหมายเลขระบุตำแหน่งสองชุด เพราะมันใช้เนื้อที่สองไบต์ ผิดครับ แม้จะเป็นข้อมูลที่มีหลายไบต์ คอมพิวเตอร์คงใช้หมายเลขเดียว คือจะระบุตำแหน่งเพียงไบต์แรกเท่านั้น

ยกตัวอย่าเช่นคุณจองเนื้อที่ในหน่วยความจำเพื่อเก็บข้อมูลชนิด short และคอมพิวเตอร์ได้สงวนพื้นที่ไว้สองตำแหน่งคือ 400 และ 401 คอมพิวเตอร์จะอ้างถึงตำแหน่ง 400 เพียงตำแหน่งเดียวเท่านั้น แต่คอมพิวเตอร์จะรู้ว่าทั้งตำแหน่ง 400 และตำแหน่ง 401 เป็นส่วนหนึ่งของข้อมูลเดียวกัน เพราะมันได้จองเนื้อที่ไว้ให้สองไบต์แล้วตั้งแต่แรก ดังนั้นถ้าคุณสั่งให้คัดลอกข้อมูลนี้ มันจะคัดลอกข้อมูลทั้งในตำแหน่ง 400 และในตำแหน่ง 401 มาให้โดยอัตโนมัติ

 

คำถามท้ายบท
โปรดตอบคำถามต่อไปนี้ ถ้าข้อไหนตอบไม่ได้ให้อ่านทบทวนเนื้อหาในบทความชุดนี้อีกที ตอบได้ครบทุกข้อเมื่อไหร่จึงจะถึอว่าผ่าน
1.    อะไรคือชนิดข้อมูล
2.    ชนิดข้อมูลแบบใดเหมาะสำหรับเก็บจำนวนเต็ม
3.    จงอธิบายวิธีอ้างตำแหน่งข้อมูล เมื่ออ้างถึงชนิดข้อมูลที่โตกว่าหนึ่งไบต์
4.    ข้อมูลชนิด float ต่างจาก double อย่างไร
5.    ความเที่ยงตรง (ความละเอียดแม่นยำ) คืออะไร
6.    จงอธิบายวิธีการการจัดเรียงหน่วยความจำในคอมพิวเตอร์
7.    อะไรคือระบบเลขฐาน
8.    เพราะเหตุใดคอมพิวเตอร์จึงใช้ระบบเลขฐานสอง
9.    เพราะเหตุใดเมื่อเราจองเนื้อที่ในหน่วยความจำ เราจึงไม่จำเป็นต้องกำหนดจำนวนไบต์
10.    จงอธิบายว่าตัวเลขแบบแสดงเครื่องหมาย และแบบไม่แสดงเครื่องหมาย ถูกเก็บในหน่วยความจำแตกต่างกันอย่างไร

 

เกี่ยวกับผู้เขียน
ลาภลอย วานิชอังกูร
ทำงานด้านคอมพิวเตอร์มานานกว่ายี่สิบปี สามารถเขียนโปรแกรมได้คล่องหลายภาษา เคยทำงานด้านคอมพิวเตอร์ที่ประเทศสหรัฐอเมริกา ประเทศเยอรมัน และประเทศสวิส เคยเป็นครูสอนวิชาคอมพิวเตอร์ เคยเป็นบรรณาธิการนิตยสารคอมพิวเตอร์ มีผลงานบทความ และตำราคอมพิวเตอร์จำนวนมาก ปัจจุบันทำหน้าที่เป็นผู้ให้คำปรึกษาด้านฮาร์ดแวร์และซอฟท์แวร์แก่บริษัทขนาดใหญ่หลายแห่ง ท่านสามารถติดต่อกับผู้เขียนได้ที่ laploy.com

Post a comment or leave a trackback: Trackback URL.

ใส่ความเห็น

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

%d bloggers like this: