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

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

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

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

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

 

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

 

สำรวจหน่วยความจำ

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

หน่วยความจำแคชในซีพียู ใช้เก็บข้อมูลและคำสั่งที่ใช้บ่อยๆ หรือเพิ่งถูกใช้ไป หรือคาดว่าจะถูกเรียกใช้ในอนาคตอันใกล้ แคชจะถูกแบ่งเป็นส่วนๆ เรียกว่ารีจิสเตอร์ (Register) รีจิสเตอร์คือหน่วยความจำขนาดเล็กที่อยู่ภายใน ซีพียู (CPU Central Processing Unit หน่วยประมวลผลกลาง) ทำหน้าที่เก็บข้อมูลหรือคำสั่งเป็นการชั่วคราว

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

 


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

เป็นเรื่องปรกติที่ซอฟต์แวร์ระบบปฏิบัติการ (Operating System เช่น Windows และ Linux) จะนำหน่วยความจำถาวรบางส่วน มาทำเป็นหน่วยความจำเสมือน (Virtual memory) อันเป็นเทคนิคที่ระบบปฏิบัติการใช้ เพื่อเพิ่มความจุของหน่วยความจำหลัก ให้มากกว่าปริมาณของแรมที่มีอยู่ในเครื่อง การทำงานของมันเป็นดังนี้ เมื่อหน่วยความจำหลักถูกใช้ไปจนเกินความจุของแรม ระบบปฏิบัติการจะนำข้อมูลที่เกินนี้ไปเก็บไว้ที่ในฮาร์ดดิสก์ ครั้นเมื่อคอมพิวเตอร์ต้องการใช้ข้อมูลนั้น ระบบปฏิบัติการจะนำข้อมูลในฮาร์ดดิสก์ มาสลับที่กับข้อมูลในแรมส่วนที่ยังไม่จำเป็นต้องใช้ในตอนนั้น

 

<< บัสคือสายไฟเชื่อมต่อระหว่างซีพียู หน่วยความจำ และอุปกรณ์ I/O

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

 

 เรื่องของข้อมูลและหน่วยความจำ

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

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

 

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

อย่างไรก็ดี จำนวนหนึ่งบิตไม่สามารถเก็บอะไรได้มากนัก จึงต้องใช้สวิตช์หลายตัวๆ มารวมกัน เช่นสวิตช์สองตัว จะได้สองบิต ซึ่งทำให้เก็บค่าที่แตกต่างกันได้สี่ค่า ดังแสดงในตาราง 1-1 คือใช้แทนเลขได้จาก 0 ถึง 3 ข้อให้สังเกตว่า ตัวเลขต่ำสุดในระบบเลขฐานสอง คือเลขศูนย์ ไม่ใช่เลขหนึ่ง หาเราใช้หน่วยความจำขนาดแปดบิต หรือที่เรียกว่าหนึ่งไบต์ (Byte) จะเก็บค่าที่แตกต่างกันได้ 256 ค่า ซึ่งนำมาใช้แทนตัวเลขจาก 0 ถึง 255 ได้

 

เราใช้ทรานซิสเตอร์หนึ่งตัวทำสวิตช์ ได้หนึ่งตัว แทนค่าได้หนึ่งบิต ในชิพซีพียูและแรมจะมีทรานซิสเตอร์บรรจุอยู่ภายในหลายร้อยล้านตัว >>

  

การนับเลขฐานสอง

ระบบจำนวน (Numbering system) คือวิธีนับ และวิธีกระทำทางคณิตศาสตร์ มนุษย์ใช้เลขฐานสิบในการนับ ส่วนคอมพิวเตอร์ใช้เลขฐานสองในการนับ ทั้งสองระบบทำงานเหมือนกันทุกประการ หากคุณบวกลบคุณหารโดยใช้เลขฐานสอง คุณจะได้คำตอบเช่นเดียวกันหากใช้เลขฐานสิบ

อย่างไรก็ดี ข้อแตกต่างอันควรสังเกตระหว่างเลขฐานสอง และเลขฐานสิบคือ เลขฐานสิบประกอบด้วยตัวเลขที่แตกต่างกันสิบตัว (0 ถึง 9) ส่วนเลขฐานสองประกอบด้วยตัวเลขเพียงสองตัวเท่านั้น (0 และ 1)

ขอสะกิดความจำของคุณสักนิด ให้นึกย้อนกลับไปสมัยเรียนชั้นประถม คุณจำตอนที่คุณเรียนเรื่องการบวกและการทดเลขจากหลักขวาไปหลักซ้ายได้หรือไม่? ยกตัวอย่างเช่น สมมุติว่าโจทย์คือ 9 เป็นตัวตั้ง แล้วนำ 1 มาบวก วิธีทำคือเปลี่ยนเลข 9 ให้เป็นเลข 0 และจะได้ตัวทดเป็น 1 ที่ต้องนำไปไว้ทางซ้ายของเลข 0 ซึ่งจะได้ผลลัพธ์เป็น 10 การบวกเลขฐานสองก็ใช้วิธีทดแบบเดียวกัน แต่แทนที่จะทดเมื่อตัวเลขทางขวาเป็น 9 ก็กลายเป็นเป็นว่า ต้องทดเมื่อตัวเลขทางขวาเป็น 1 ดังนั้นการทำ 1+1 ก็คือการเปลี่ยนเลข 1 ให้เป็นเลข 0 แล้วนำตัวทดคือเลข 1 ไปใส่ไว้ทางซ้าย ผลลัพธ์ที่ได้ก็จะเป็น 10

 

กฎในการบวกเลขฐานสอง

 

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

 

นี่คือกฎของการบวกเลขฐานสองเมื่อแสดงในลักษณะตารางความจริง (truth table) จะเห็นว่าเมื่อ 1 บวกกับ 1 จะเกิดตัวทดหรือ carry ขึ้น

 

การจองหน่วยความจำ

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

ชนิดข้อมูลเป็นคีย์เวิร์ด (keyword คือคำที่สงวนไว้เพราะมีความหมายพิเศษในภาษาคอมพิวเตอร์) ที่ใช้ในการเขียนโปรแกรม มันทำหน้าที่กำหนดขนาดของหน่วยความจำและชนิดของข้อมูลที่จะเก็บ แต่อย่างไรก็ดี ชนิดของข้อมูลไม่ได้บอกคอมพิวเตอร์ว่าเราต้องการจองเนื้อที่จำนวนกี่ไบต์ เพราะจำนวนไบต์ที่ชนิดข้อมูลแต่ละแบบต้องการไม่ตายตัว ขึ้นอยู่กับภาษาที่ใช้เขียนโปรแกรม และชนิดของคอมพิวเตอร์ที่ใช้ คอมไพล์ (compile การแปลภาษารับดับสูงให้เป็นภาษาเครื่อง)

ชนิดข้อมูลในภาษา C# มีขนาดตายตัว เพราะโปรแกรมที่เขียนด้วยภาษา C# จะรันบนสภาพแวดล้อมเหมือนเดิมตลอด (เรียกว่า CLR หรือ Common Language Runtime) ส่วนภาษา C และ C++ ชนิดข้อมูลจะมีขนาดไม่แน่นอน ขึ้นอยู่กับขนาดของรีจิสเตอร์ของคอมพิวเตอร์ที่จะใช้ ชนิดข้อมูล int และ float จะมีขนาดเท่ารีจิสเตอร์ ส่วน short จะมีขนาดครึ่งหนึ่งของ int ส่วนชนิดข้อมูล long จะมีขนาดเป็นสองเท่าของ int

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

 

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

 

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

 

เกี่ยวกับผู้เขียน

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

Post a comment or leave a trackback: Trackback URL.

ความเห็น

  • GruBa  On พฤษภาคม 19, 2009 at 12:46 pm

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

ใส่ความเห็น

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: