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

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

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

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

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

 

กลุ่มชนิดข้อมูล

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

กลุ่มชนิดข้อมูลมีสี่กลุ่มดังนี้

  • จำนวนเต็ม (integer) : ใช้เก็บเลขจำนวนเต็ม และเลขแบบมีเครื่องหมาย เหมาะสำหรับเก็บจำนวนที่ไม่สนใจเศษ เช่นจำนวนเงินในกระเป๋าสตางค์ของคุณ
  • เลขทศนิยม (Floating-point) : ใช้เก็บเลขจำนวนจริง (จำนวนเศษส่วน) เหมาะสำหรับเก็บเลขในบัญชีธนาคารที่มีเศษสตางค์ (คือเศษส่วนของบาท) และสามารถนำมาบวกกันให้เป็นจำนวนบาทได้อย่างรวดเร็ว
  • อักขระ (Character) : ใช้เก็บตัวอักษร เหมาะสำหรับเก็บชื่อของสิ่งต่างๆ
  • บูลีน (Boolean) : ใช้เก็บค่าจริง หรือเท็จ (true/false) เหมาะสำหรับเก็บคำตอบของคำถามว่าใช่หรือไม่ใช่ จริงหรือเท็จ

 

จำนวนเต็ม

กลุ่มข้อมูลชนิดนี้ใช้จองพื้นที่ในหน่วยความจำเพื่อเก็บเลขจำนวนเต็ม มีทั้งหมดเก้าแบบเช่น byte, short, int, long และอื่นๆ ดังแสดงในตารางนี้

 

 

ข้อมูลชนิดจำนวนเต็มสามารถใช้เก็บเลขที่แสดงเครื่องหมาย คือเลขบวกและเลขลบ เช่น +10 และ –5 ถ้าไม่ระบุเครื่องหมายตามปรกติแล้วจะถือว่าเป็นเลขบวก ดังนั้นเครื่องหมายบวกจึงสามารถละไว้ในฐานที่เข้าใจ เลขจำนวนเต็มเมื่อเก็บแบบแสดงเครื่องหมายจะเรียกว่า signed number เมื่อเก็บแบบไม่สนแสดงเครื่องหมายจะเรียกว่า unsigned number

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

ยกตัวอย่างเช่นข้อมูลแบบ byte ใช้เนื้อที่ในหน่วยความจำแปดบิต หากเก็บเลขจำนวนเต็มแบบไม่แสดงเครื่องหมาย จะก็จะเก็บเลขได้จาก 0 ถึง 255 หากเป็นเลขจำนวนเต็มแบบแสดงเครื่องหมาย หรือ sbyte ก็จะเก็บเลขได้น้อยกว่าครึ่งหนึ่ง คือเก็บจำนวนได้จาก –128 ถึง +127 (ดูในตาราง) ภาษา C# สนับสนุนเลขจำนวนเต็มทั้งแบบแสดงและไม่แสดงเครื่องหมาย เลขที่ไม่แสดงเครื่องหมายจะถูกเหมาว่าเป็นบวก เครื่องหมายลบจะไม่ถูกเก็บไว้ในหน่วยความจำ และจำนวนศูนย์จะถูกถือว่าเป็นจำนวนลบ

 

ข้อมูลชนิด byte

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

 

byte x = 10, y = 20;
 

โค้ดที่เห็นข้างบนทำหน้าที่ประกาศตัวแปรสองตัวชื่อ x และ y โดยมีชนิดข้อมูลเป็น byte ทั้งคู่

 

** จงใช้ชนิดข้อมูลแบบ byte เมื่อใดก็ตามที่คุณต้องการรับ-ส่งข้อมูลในเครือข่าย หรือเมื่อต้องการทำงานกับข้อมูลในระดับบิต **

 

อักขระ (Characters)

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

ตารางรหัสอักขระจะเป็นตัวกำหนดว่าตัวเลขอะไรใช้แทนตัวอักษรใด มีตารางรหัสอักขระที่นิยมใช้มากสองแบบคือรหัสแอสกี (ASCII) และรหัสยูนิโค้ด (Unicode) แอสกีเป็นตารางรหัสที่เป็นบรรพบุรุษของยูนิโค้ด แอสกีใช้หน่วยความจำหนึ่งไบต์ เก็บรหัสแทนอักขระต่างๆ ได้ 256 ตัว อย่างไรก็ดี เมื่อมีการใช้คอมพิวเตอร์กับภาษาที่ไม่ใช่ภาษาอังกฤษ เช่นภาษาจีน ซึ่งเป็นภาษาที่มีอักขระมากกว่า 256 ตัว จึงใช้กับรหัสแอสกีไม่ได้ รหัสยูนิโค้ดได้ถูกพัฒนามาเพื่อแก้ปัญหานี้ รหัสยูนิโค้ดจะใช้เนื้อที่ในหน่วยความจำสองไบต์

 

** จงใช้ชนิดข้อมูลแบบ char เมื่อใดก็ตามที่คุณต้องการเก็บตัวอักษรในหน่วยความจำ  **

 

ข้อมูลชนิด short

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

 

** จงใช้ชนิดข้อมูลแบบ short เมื่อคุณต้องการเขียนโปรแกรมสำหรับคอมพิวเตอร์รุ่นเก่ามากๆ  **

 

ข้อมูลชนิด int

ชนิดข้อมูลแบบ int เป็นชนิดข้อมูลที่นิยมใช้มากที่สุดในกลุ่มชนิดข้อมูลจำนวนเต็มด้วยเหตุผลหลายประการ

 

** จงใช้ชนิดข้อมูลแบบ int เมื่อ

  • ใช้เป็นตัวแปรสำหรับควบคุมการทำงานซ้ำ (loop)
  • ใช้เป็นดรรชนีของอาร์เรย์ (array index)
  • ใช้ในการกระทำทางคณิตศาสตร์ของเลขจำนวนเต็ม **

 

ข้อมูลชนิด long

ชนิดข้อมูลแบบ long เหมาะสำหรับใช้เมื่อต้องการทำงานกับตัวเลขที่มีขนาดใหญ่เกินกว่าจะใช้ชนิดข้อมูลแบบ int

 

** จงใช้ชนิดข้อมูลแบบ long เมื่อต้องการเก็บตัวเลขจำนวนหลายๆ หลัก เช่นมูลค่าทรัพย์สินของบิล เกสต์ ของนายกฯ ทักษิณ หรือของตัวคุณเอง **

 

จำนวนทศนิยม (Floating-Point)

ชนิดข้อมูลในนี้ใช้เพื่อเก็บเลขจำนวนจริง (real number) จำนวนจริงคือจำนวนที่มีทศนิยม ชนิดข้อมูลนี้มีสองแบบคือ float และ doubleโดย float ใช้สำหรับเก็บจำนวนที่มีความเที่ยงตรงตามปรกติ ส่วน double ใช้สำหรับจำนวนที่ต้องการความเที่ยงตรงเป็นสองเท่า ความเที่ยงตรง (precision) ในที่นี้หมายถึงจำนวนหลักของตัวเลขหลังจุดทศนิยม ถ้ายิ่งมีหลายหลัก ตัวเลขก็จะยิ่งถูกต้องเที่ยงตรงมากขึ้นตามที่เห็นในตารางข้างล่าง

 

 

สาเหตุที่ใช้คำว่า floating-point (จุดลอย) เกิดจากวิธีที่มันเก็บตัวเลขทศนิยมในหน่วยความจำ ซึ่งใช้วิธีเก็บตัวเลขทั้งหมด (จำนวนทั้งหน้าและหลังจุดทศนิยม) เป็นจำนวนเต็ม แล้วตำแหน่งของจุดทศนิยมไว้ต่างหาก วิธีเก็บเช่นนี้ทำให้ดูเหมือนว่าจุดทศนิยมลอยตัว (float) อยู่เหนือตัวเลข ยกตัวอย่างเช่นเลข 43.23 จะถูกเก็บเป็น 4323 (เก็บเป็นจำนวนเต็มไม่มีทศนิยม) การกำหนดจุดทศนิยมทำได้โดยการอ้างถึงหลักของตัวเลขที่จะประจุดทศนิยม ซึ่งในกรณีนี้คือหน้าหลักที่สอง

 

โครงสร้างของข้อมูลแบบ floating-point มีสามส่วนคือ sing bit, exponent และ mantissa

 

ข้อมูลชนิด float

ชนิดข้อมูลแบบ float เหมาะสำหรับเก็บเลขจำนวนจริงที่ต้องการความเที่ยงตรงแบบปรกติ อย่างเช่นจำนวนเงิน ความเที่ยงตรงแบบปรกติคือมีจำนวนเลขหลังจุดทศนิยมเจ็ดหลัก ยกตัวอย่างเช่นแบ่งเงินจำนวน 53.50 บาทให้คน 17 คนจะได้คนละ 3.147058823529 บาท ถ้าเก็บเป็นแบบ float ก็จะเหลือแค่ 3.1470588 ซึ่งไม่ได้เที่ยงตรงอย่างถึงที่สุด แต่ก็เพียงพอสำหรับจำนวนเงิน

 

** จงใช้ float เมื่อคุณต้องการตัวเลขแบบมีทศนิยมที่ต้องการความละเอียดขนาดจำนวนหลักหลังจุดทศนิยม 7 หลัก  **

 

ข้อมูลชนิด double

ชนิดข้อมูลแบบ double ใช้เก็บจำนวนมีทศนิยมซึ่งมีค่าสูงมากๆ หรือต่ำมากๆ ใช้พื้นในหน่วยความจำมากเป็นสองเท่าของ float

 

** จงใช้ double เมื่อต้องการเก็บตัวเลขที่มีจำนวนหลักหลังจุดทศนิยมมากกว่า 7 หลัก  **

 

ข้อมูลชนิด บูลีน

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

 

** ข้อควรระวังในการใช้ข้อมูลชนิดบูลีนคือในภาษา C++ เราสามารถแปลงข้อมูลชนิดบูลีนไปเป็นแบบจำนวนเต็มได้เลย คือ true ไปเป็น 1 และ false ไปเป็น 0 แต่ในภาษา C# ทำเช่นนั้นไม่ได้ เพราะภาษา C# เราจะแปลงข้อมูลชนิดบูลีนไปเป็นชนิดอื่นๆ ไม่ได้  **

 

int x = 123;
if (x)  
{
    printf_s("The value of x is nonzero.");
}
 

โค้ดข้างบนเป็นภาษา C++ ใน C# ต้องเขียนแบบข้างล่างแทน

 

int x = 123;
if (x != 0)   
{
    Console.Write("The value of x is nonzero.");
}

 

นอกจากชนิดข้อมูลที่ว่ามาทั้งหมดแล้ว C# ยังมีข้อมุลแบบ String และ Array ซึ่งมีรายละเอียดมาก สมควรนำเสนอแยกต่างหากออกไป นอกจากนั้น C# ยังมีชนิดข้อมูลแบบพิเศษอื่นๆ อีกหลายแบบเช่น struc, nullable และ delegate ที่จะนำเสนอในต่อต่อๆ ไปเช่นกัน

 

จบตอน 2 โปรดติดตามตอน 3

 

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

 

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