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

Typecasting ใน C คืออะไร?
การแปลงประเภทข้อมูลคือการแปลงประเภทข้อมูลหนึ่งไปเป็นอีกประเภทหนึ่ง เรียกอีกอย่างหนึ่งว่าการแปลงข้อมูลหรือการแปลงประเภทข้อมูลในภาษาซี ถือเป็นแนวคิดสำคัญอย่างหนึ่งที่นำเสนอในการเขียนโปรแกรมแบบ "C"
การเขียนโปรแกรมแบบ 'C' มีการดำเนินการแปลงประเภทสองประเภท:
- การหล่อประเภทโดยนัย
- การหล่อประเภทที่ชัดเจน
การหล่อประเภทโดยนัย
การแปลงประเภทข้อมูลโดยปริยาย หมายถึงการแปลงประเภทข้อมูลโดยไม่สูญเสียความหมายดั้งเดิม การแปลงประเภทข้อมูลประเภทนี้มีความสำคัญเมื่อคุณต้องการเปลี่ยนประเภทข้อมูลโดยไม่เปลี่ยนแปลงความหมายของค่าที่จัดเก็บอยู่ภายใน ตัวแปร.
การแปลงประเภทโดยปริยายใน C จะเกิดขึ้นโดยอัตโนมัติเมื่อค่าถูกคัดลอกไปยังประเภทข้อมูลที่เข้ากันได้ ในระหว่างการแปลง จะมีการใช้กฎเกณฑ์ที่เข้มงวดสำหรับการแปลงประเภท หากตัวดำเนินการมีประเภทข้อมูลที่แตกต่างกันสองประเภท ตัวดำเนินการที่มีประเภทข้อมูลต่ำกว่าจะถูกแปลงเป็นประเภทข้อมูลที่สูงกว่าโดยอัตโนมัติ การแปลงประเภทนี้สามารถดูได้จากตัวอย่างต่อไปนี้
#include<stdio.h> int main(){ short a=10; //initializing variable of short data type int b; //declaring int variable b=a; //implicit type casting printf("%d\n",a); printf("%d\n",b); }
Output:
10 10
- ในตัวอย่างที่กำหนด เราได้ประกาศตัวแปรประเภทข้อมูลแบบสั้นโดยมีค่าเริ่มต้นเป็น 10
- ในบรรทัดที่สอง เราได้ประกาศตัวแปรประเภทข้อมูล int
- ในบรรทัดที่สาม เราได้กำหนดค่าของตัวแปร s ให้กับตัวแปร a ในบรรทัดที่สาม การแปลงประเภทโดยนัยจะดำเนินการโดยค่าจากตัวแปร s ซึ่งเป็นประเภทข้อมูลแบบสั้นจะถูกคัดลอกไปยังตัวแปร a ซึ่งเป็นประเภทข้อมูล int
การแปลงตัวละครเป็น Int
ลองพิจารณาตัวอย่างการเพิ่มอักขระที่ถอดรหัสใน ASCII ด้วยจำนวนเต็ม:
#include <stdio.h> main() { int number = 1; char character = 'k'; /*ASCII value is 107 */ int sum; sum = number + character; printf("Value of sum : %d\n", sum ); }
Output:
Value of sum : 108
ที่นี่ คอมไพเลอร์จะทำการเลื่อนระดับจำนวนเต็มโดยการแปลงค่าของ 'k' เป็น ASCII ก่อนที่จะดำเนินการบวกจริง
ลำดับชั้นการแปลงทางคณิตศาสตร์
คอมไพเลอร์จะดำเนินการเลื่อนตำแหน่งอักขระเป็นจำนวนเต็มก่อน หากตัวดำเนินการยังคงมีชนิดข้อมูลที่แตกต่างกัน ตัวดำเนินการเหล่านั้นจะถูกแปลงเป็นชนิดข้อมูลสูงสุดที่ปรากฏในแผนภูมิลำดับชั้นต่อไปนี้:
พิจารณาตัวอย่างต่อไปนี้เพื่อทำความเข้าใจแนวคิด:
#include <stdio.h> main() { int num = 13; char c = 'k'; /* ASCII value is 107 */ float sum; sum = num + c; printf("sum = %f\n", sum );}
Output:
sum = 120.000000
ขั้นแรก ตัวแปร c จะถูกแปลงเป็นจำนวนเต็ม แต่คอมไพเลอร์จะแปลง num และ c เป็น "float" แล้วนำมาบวกกันเพื่อให้ได้ผลลัพธ์เป็น "float" เช่นกัน
ประเด็นสำคัญเกี่ยวกับ Conversion โดยนัย
- การแปลงประเภทโดยนัยเรียกอีกอย่างว่าการแปลงประเภทมาตรฐาน เราไม่จำเป็นต้องมีคำสำคัญหรือข้อความพิเศษใด ๆ ในการคัดเลือกประเภทโดยนัย
- การแปลงจากชนิดข้อมูลขนาดเล็กไปเป็นชนิดข้อมูลขนาดใหญ่เรียกว่า การเลื่อนระดับชนิดข้อมูล (type promotion) ในตัวอย่างข้างต้น เราอาจกล่าวได้ว่าค่าของ s ถูกเลื่อนระดับเป็นชนิดข้อมูลจำนวนเต็ม (integer)
- การแปลงประเภทโดยนัยจะเกิดขึ้นกับประเภทข้อมูลที่เข้ากันได้เสมอ
เราไม่สามารถดำเนินการหล่อประเภทโดยนัยกับประเภทข้อมูลที่เข้ากันไม่ได้เช่น:
- การแปลง float เป็น int จะตัดทอนส่วนที่เป็นเศษส่วนจึงสูญเสียความหมายของค่า
- การแปลงเลขคู่เป็นเลขลอยตัวจะปัดเศษตัวเลข
- การแปลง long int เป็น int จะทำให้ค่าลดลงping ของบิตลำดับสูงส่วนเกิน
ในกรณีทั้งหมดข้างต้น เมื่อเราแปลงชนิดข้อมูล ค่าจะสูญเสียความหมาย โดยทั่วไป การสูญเสียความหมายของค่าจะถูกเตือนโดยคอมไพเลอร์
การเขียนโปรแกรม 'ซี' ให้วิธีการพิมพ์อีกวิธีหนึ่งซึ่งเป็นการหล่อประเภทที่ชัดเจน
การหล่อประเภทที่ชัดเจน
ในการแปลงประเภทโดยปริยาย ประเภทข้อมูลจะถูกแปลงโดยอัตโนมัติ มีบางสถานการณ์ที่เราอาจต้องบังคับแปลงประเภท สมมติว่าเรามีตัวแปร div ที่จัดเก็บการแบ่งตัวดำเนินการสองตัวซึ่งประกาศเป็นประเภทข้อมูล int
int result, var1=10, var2=3;
result=var1/var2;
ในกรณีนี้ หลังจากทำการหารตัวแปร var1 และ var2 แล้ว ผลลัพธ์ที่เก็บไว้ในตัวแปร "result" จะอยู่ในรูปแบบจำนวนเต็ม เมื่อใดก็ตามที่เกิดเหตุการณ์นี้ขึ้น ค่าที่เก็บไว้ในตัวแปร "result" จะสูญเสียความหมาย เนื่องจากตัวแปรไม่ได้คำนึงถึงเศษส่วนที่ปกติจะได้จากการหารตัวเลขสองตัว
เพื่อบังคับให้มีการแปลงประเภทในสถานการณ์เช่นนี้ เราใช้การคัดเลือกประเภทที่ชัดเจน
จำเป็นต้องใช้ตัวดำเนินการการหล่อประเภท รูปแบบทั่วไปของการดำเนินการหล่อประเภทมีดังนี้:
(type-name) expression
ที่นี่
- ชื่อประเภทคือประเภทข้อมูลภาษา 'C' มาตรฐาน
- นิพจน์อาจเป็นค่าคงที่ ตัวแปร หรือนิพจน์จริงก็ได้
ให้เราเขียนโปรแกรมเพื่อสาธิตวิธีการพิมพ์ดีดในภาษา C ด้วยการพิมพ์ที่ชัดเจน
#include<stdio.h> int main() { float a = 1.2; //int b = a; //Compiler will throw an error for this int b = (int)a + 1; printf("Value of a is %f\n", a); printf("Value of b is %d\n",b); return 0; }
Output:
Value of a is 1.200000 Value of b is 2
- เราได้เริ่มต้นตัวแปร 'a' ประเภท float แล้ว
- ต่อไป เรามีตัวแปรอีกตัวหนึ่งชื่อ 'b' ซึ่งเป็นชนิดข้อมูลจำนวนเต็ม เนื่องจากตัวแปร 'a' และ 'b' มีชนิดข้อมูลต่างกัน ภาษา 'C' จึงไม่อนุญาตให้ใช้สูตรดังกล่าวและจะแสดงข้อผิดพลาด ในบางเวอร์ชันของภาษา 'C' สูตรดังกล่าวจะถูกประเมินผล แต่ผลลัพธ์อาจไม่ใช่ผลลัพธ์ที่ต้องการ
- เพื่อหลีกเลี่ยงสถานการณ์ดังกล่าว เราได้พิมพ์ตัวแปร 'a' ของประเภท float ด้วยการใช้วิธีการหล่อประเภทที่ชัดเจน เราได้แปลงจำนวนทศนิยมเป็นจำนวนเต็มประเภทข้อมูลได้สำเร็จ
- เราได้พิมพ์ค่า 'a' ซึ่งยังคงเป็นค่าลอยตัว
- หลังจากพิมพ์ดีดแล้ว ผลลัพธ์จะเป็นจำนวนเต็ม 'b' เสมอ
ด้วยวิธีนี้ เราสามารถใช้การคัดเลือกประเภทที่ชัดเจนในการเขียนโปรแกรม C ได้



