การแปลงชนิดข้อมูลในภาษา C: การแปลงโดยปริยายและการแปลงโดยชัดแจ้ง

⚡ สรุปอย่างชาญฉลาด

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

  • 🔄 มีสองรูปแบบ: การแปลงประเภทโดยปริยายจะทำงานโดยอัตโนมัติ ส่วนการแปลงประเภทโดยชัดแจ้งจะเขียนด้วยตัวดำเนินการแปลงประเภท
  • ⬆️ ประเภทการโปรโมต: การแปลงชนิดข้อมูลขนาดเล็กไปเป็นชนิดข้อมูลที่ใหญ่กว่าที่เข้ากันได้ เช่น จาก short เป็น int จะไม่ทำให้ค่าของชนิดข้อมูลนั้นเปลี่ยนแปลงไป
  • 🇧🇷 ความเสี่ยงต่อการสูญเสียข้อมูล: การแปลงประเภทข้อมูลแบบแคบ เช่น การแปลงทศนิยมเป็นจำนวนเต็ม จะทำให้เศษส่วนหายไปและสูญเสียความหมาย
  • 🎯 ไวยากรณ์ที่ระบุอย่างชัดเจน: การเขียนนิพจน์ (ประเภท-ชื่อ) จะบังคับให้มีการแปลง เช่น การแปลงตัวถูกดำเนินการที่เป็นจำนวนเต็มเป็นทศนิยม
  • 🤖 ความช่วยเหลือจากเอไอ: ผู้ช่วย AI และ GitHub Copilot จะร่างนิพจน์การแสดงบทบาทและแจ้งเตือนการแปลงที่แคบลงซึ่งมีความเสี่ยง

การหล่อแบบตัวอักษร 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

การหล่อประเภทโดยนัย

  1. ในตัวอย่างที่กำหนด เราได้ประกาศตัวแปรประเภทข้อมูลแบบสั้นโดยมีค่าเริ่มต้นเป็น 10
  2. ในบรรทัดที่สอง เราได้ประกาศตัวแปรประเภทข้อมูล int
  3. ในบรรทัดที่สาม เราได้กำหนดค่าของตัวแปร 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)
  • การแปลงประเภทโดยนัยจะเกิดขึ้นกับประเภทข้อมูลที่เข้ากันได้เสมอ

เราไม่สามารถดำเนินการหล่อประเภทโดยนัยกับประเภทข้อมูลที่เข้ากันไม่ได้เช่น:

  1. การแปลง float เป็น int จะตัดทอนส่วนที่เป็นเศษส่วนจึงสูญเสียความหมายของค่า
  2. การแปลงเลขคู่เป็นเลขลอยตัวจะปัดเศษตัวเลข
  3. การแปลง 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

การหล่อประเภทที่ชัดเจน

  1. เราได้เริ่มต้นตัวแปร 'a' ประเภท float แล้ว
  2. ต่อไป เรามีตัวแปรอีกตัวหนึ่งชื่อ 'b' ซึ่งเป็นชนิดข้อมูลจำนวนเต็ม เนื่องจากตัวแปร 'a' และ 'b' มีชนิดข้อมูลต่างกัน ภาษา 'C' จึงไม่อนุญาตให้ใช้สูตรดังกล่าวและจะแสดงข้อผิดพลาด ในบางเวอร์ชันของภาษา 'C' สูตรดังกล่าวจะถูกประเมินผล แต่ผลลัพธ์อาจไม่ใช่ผลลัพธ์ที่ต้องการ
  3. เพื่อหลีกเลี่ยงสถานการณ์ดังกล่าว เราได้พิมพ์ตัวแปร 'a' ของประเภท float ด้วยการใช้วิธีการหล่อประเภทที่ชัดเจน เราได้แปลงจำนวนทศนิยมเป็นจำนวนเต็มประเภทข้อมูลได้สำเร็จ
  4. เราได้พิมพ์ค่า 'a' ซึ่งยังคงเป็นค่าลอยตัว
  5. หลังจากพิมพ์ดีดแล้ว ผลลัพธ์จะเป็นจำนวนเต็ม 'b' เสมอ

ด้วยวิธีนี้ เราสามารถใช้การคัดเลือกประเภทที่ชัดเจนในการเขียนโปรแกรม C ได้

คำถามที่พบบ่อย

การแปลงชนิดข้อมูล (Type conversion) คือการเปลี่ยนแปลงอัตโนมัติของคอมไพเลอร์ ส่วนการแคสติ้งชนิดข้อมูล (Type casting) คือการเปลี่ยนแปลงที่คุณร้องขออย่างชัดเจนด้วยตัวดำเนินการแคสต์ การแคสติ้งเป็นรูปแบบหนึ่งของการแปลงชนิดข้อมูล

ทำได้ค่ะ การแปลง float เป็น int จะตัดทศนิยมทิ้ง การแปลง double เป็น float จะปัดเศษ และการแปลง long เป็น int จะตัดบิตลำดับสูงทิ้ง การแปลงแบบขยายขอบเขตยังคงปลอดภัยค่ะ

ใช่ ภาษา C อนุญาตให้คุณแปลงประเภทตัวชี้จากประเภทหนึ่งไปเป็นอีกประเภทหนึ่งได้ และตัวชี้ไปยังอ็อบเจ็กต์จะแปลงเป็น void* และกลับกันได้ การเข้าถึงค่าที่ตัวชี้ซึ่งแปลงประเภทไม่เข้ากันชี้อยู่ จะทำให้เกิดพฤติกรรมที่ไม่แน่นอน

ภาษา C มีเพียงการแปลงค่าแบบ C-style (type)value เท่านั้น C++ เพิ่มการแปลงประเภทข้อมูลแบบมีชื่อที่ปลอดภัยกว่าสี่แบบ ได้แก่ static_cast, dynamic_cast, const_cast และ reinterpret_cast โดยมีเจตนาที่ชัดเจนยิ่งขึ้นและได้รับการตรวจสอบโดยคอมไพเลอร์

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

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

ใช่แล้ว ผู้ช่วย AI จะเขียนนิพจน์การแปลงประเภทจากข้อความแจ้ง อธิบายกฎการโปรโมต และแจ้งเตือนเมื่อการแปลงอาจทำให้ข้อมูลสูญหาย ควรคอมไพล์และทดสอบผลลัพธ์เสมอ

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

สรุปโพสต์นี้ด้วย: