การหล่อประเภทใน C: การแปลงประเภท, โดยนัย, ชัดเจนพร้อมตัวอย่าง
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 ลงใน "ลอย" และเพิ่มเพื่อสร้างผลลัพธ์ 'ลอย'
ประเด็นสำคัญเกี่ยวกับ Conversion โดยนัย
- การแปลงประเภทโดยนัยเรียกอีกอย่างว่าการแปลงประเภทมาตรฐาน เราไม่จำเป็นต้องมีคำสำคัญหรือข้อความพิเศษใด ๆ ในการคัดเลือกประเภทโดยนัย
- การแปลงจากชนิดข้อมูลที่เล็กลงเป็นชนิดข้อมูลที่ใหญ่ขึ้นจะเรียกว่าเป็น ประเภทการส่งเสริมการขายในตัวอย่างข้างต้น เราสามารถพูดได้ว่าค่าของ s ได้รับการส่งเสริมให้เป็นชนิดจำนวนเต็ม
- การแปลงประเภทโดยนัยจะเกิดขึ้นกับประเภทข้อมูลที่เข้ากันได้เสมอ
เราไม่สามารถดำเนินการหล่อประเภทโดยนัยกับประเภทข้อมูลที่เข้ากันไม่ได้เช่น:
- การแปลง float เป็น int จะตัดทอนส่วนที่เป็นเศษส่วนจึงสูญเสียความหมายของค่า
- การแปลงเลขคู่เป็นเลขลอยตัวจะปัดเศษตัวเลข
- การแปลง long int เป็น int จะทำให้บิตลำดับสูงเกินไปลดลง
ในกรณีทั้งหมดข้างต้น เมื่อเราแปลงชนิดข้อมูล ค่าจะสูญเสียความหมาย โดยทั่วไป การสูญเสียความหมายของค่าจะถูกเตือนโดยคอมไพเลอร์
การเขียนโปรแกรม 'ซี' ให้วิธีการพิมพ์อีกวิธีหนึ่งซึ่งเป็นการหล่อประเภทที่ชัดเจน
การหล่อประเภทที่ชัดเจน
ในการแปลงประเภทโดยปริยาย ประเภทข้อมูลจะถูกแปลงโดยอัตโนมัติ มีบางสถานการณ์ที่เราอาจต้องบังคับแปลงประเภท สมมติว่าเรามีตัวแปร 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 ได้
สรุป
- การพิมพ์ดีดเรียกอีกอย่างว่าการแปลงประเภท
- มันหมายถึงการแปลงประเภทข้อมูลหนึ่งไปเป็นอีกประเภทหนึ่ง
- การแปลงประเภทข้อมูลขนาดเล็กให้เป็นประเภทข้อมูลขนาดใหญ่เรียกอีกอย่างหนึ่งว่าการส่งเสริมประเภท
- การแปลงประเภทมีสองประเภท: การแปลงประเภทโดยนัยและชัดเจนในภาษาซี
- การแปลงประเภทโดยนัยจะทำงานโดยอัตโนมัติเมื่อพบประเภทข้อมูลที่เข้ากันได้
- การแปลงประเภทอย่างชัดเจนต้องใช้ตัวดำเนินการแปลงประเภท
โปรดจำกฎต่อไปนี้ไว้สำหรับการฝึกการเขียนโปรแกรมเมื่อต้องจัดการกับชนิดข้อมูลที่แตกต่างกันเพื่อป้องกันข้อมูลสูญหาย:
- ควรแปลงประเภทจำนวนเต็มเป็นแบบทศนิยม
- ชนิดลูกลอยควรแปลงเป็นแบบคู่
- ประเภทอักขระควรแปลงเป็นจำนวนเต็ม