วันเสาร์ที่ ๑๓ สิงหาคม พ.ศ. ๒๕๕๔

ติวสอบชนิดข้อมูลพื้นฐาน (Value Types Tutorial)

เรื่องชนิดข้อมูลพื้นฐาน ผมเคยเขียนไว้แล้ว ที่ Value Types (1) : Built-in Types ซึ่งสามารถอ่านประกอบหรืออ้างอิงได้ครับ

ตัวอย่างข้อสอบ
จงเลือก data type ที่เหมาะสมกับเงื่อนไขข้อมูลต่อไปนี้
- ข้อมูลเป็นตัวเลข
- ข้อมูลมีค่ามากกว่า 32,767

ก. System.SByte
ข. System.String
ค. System.Int16
ง. UShort
ง. Char

อธิบายวิธีคิด
โจทย์ข้อนี้เป็นโจทย์ที่มีระดับความยากเพียง 1 ดาว โดยจะทดสอบความจำของเรา ใครจำได้ก็ไม่ต้องอ่านที่ผมอธิบายนะครับ

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

หลังจากตัดข้อที่ไม่ใช่ตัวเลขออกแล้ว ก็อยู่ที่ความจำของเราแล้ว โดยเทคนิคการจำของผมอันนี้เป็นวิธีของคนขี้เกียจจำอะไรเยอะๆ นะครับ แต่อาจจะคิดช้าหน่อย สำหรับเลขจำนวนเต็มผมจำแค่ 4 ตัวแล้วค่อยมาต่อยอดเอาครับ คือ Byte, Short, Integer, Long และผมจะจำไว้เสมอว่า Integer มีขนาด 32 bits แล้วค่อยรู้ขนาดของอีก 3 ตัวด้วยการลดหรือเพิ่มขนาดเป็น 2 เท่า ดังนั้น จะเรียงลำดับขนาด bits ได้แบบนี้

8 16 32 64
Byte Short Integer Long

ต่อไปเราต้องต้องคำนวนค่าที่แต่ละ data type เก็บได้มากที่สุด โดยนำ 2 มายกกำลังตามจำนวนบิตที่เราเขียนไว้ เริ่มจาก Byte ซึ่งค่าที่เก็บได้เท่ากับ 28 หรือ 256 นั้นคือ 0 ถึง 255 นั้นเอง ส่วน SByte นั้น S ข้างหน้า Byte ก็ย่อมาจากคำว่า sign หมายถึงเครื่องหมาย + หรือ - นั้นคือ กรณี SByte ต้องแบ่งครึ่ง เป็นลบและบวกอย่างละเท่าๆ กัน คือ อย่างละ 128 จะได้ -128 ถึง 127 (ฝั่งบวกรวม 0 ด้วยเลยเหลือ 127 นะครับ) จะเห็นว่าพอมาถึงตรงนี้ตัดข้อ ก. ออกได้ เพราะ System.SByte นั้นค่ามากที่สุด ยังห่างไกล 32,767 ครับ

ต่อมา Short ซึ่งเรารู้แล้วว่ามีขนาด 16 bits ถ้าเราลองสังเกตข้อ ค. จะเห็นว่า Int16 มีเลข 16 อยู่ นั้นก็หมายถึง Int16 มีขนาด 16 bits ครับ แสดงว่า Short และ System.Int16 มีขนาดเท่ากัน ส่วนการคำนวนค่าข้อมูลที่เก็บได้มากที่สุด ก็คำนวนโดยคิดเป็นเท่าตัวของ 8 bits ไม่ใช่เอา 256 x 2 นะครับ แต่หมายถึง 28 x 28 หรือ 256 x 256 ซึ่งเท่ากับ 65,536 แต่อย่าเพิ่งตอบข้อ ค. นะครับ เพราะ Short, Integer, Long จะมี UShort, UInteger, ULong คู่เสมอครับ โดย U ข้างหน้านั้น ย่อมาจาก unsign ซึ่งหมายถึง ไม่มีเครื่องหมาย หรือพูดง่ายๆว่า มีเฉพาะฝั่งบวกครับ ดังนั้น Short หรือ System.Int16 ต้องถูกแบ่งอย่างละครึ่งครึ่งละ 32,768 เป็นบวกลบ ซึ่งเท่ากับ -32,768 ถึง 32,767 ดูจากค่านี้แล้วทำให้เราต้องตัดข้อ ค. ออกครับ เพราะเงื่อนไขบอกว่าต้องมากกว่า 32,767 ไม่ใช่พอดีนะครับ

เหลือคำตอบเดียวคือ ข้อ ง. ซึ่งเป็นคำตอบแน่นอน แต่เพื่อความแน่ใจ เราลองมาตรวจคำตอบดูก่อนครับ โดยต่อจากที่เราคำนวนค่ามากที่สุดของ Short ไว้ ดังนั้น UShort ก็คือค่าที่มีเฉพาะฝั่งบวก นั้นคือ เอา 256 x 256 เท่ากับ 65,536 มาเลยก็ได้ นั้คือ 0 ถึง 65,535 (อย่าลืมลบ 1 เพราะรวมเลข 0 ด้วย) ซึ่งเป็นคำตอบเดียวที่เก็บตัวเลขมากกว่า 32,767 ได้ครับ

วิธีคิดแบบผม จะช่วยให้ไม่ต้องมานั่งจำชนิดข้อมูลมากมาย ส่วนข้อสอบ 70-536 ออกเกี่ยวกับ Value Types โดยตรงเพียงข้อเดียว

Technorati Tags: ,
 
del.icio.us Tags: ,