ข้อผิดพลาดในการแปลง
ค่าล้นและการตัดทอน
ข้อผิดพลาดในการแปลง เป็นบทเรียน C Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน C Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส C Academy มีบทเรียนทั้งหมด 4 บทเรียน
การแปลงอาจก่อปัญหาได้
การแปลงโดยไม่แจ้งเตือนนั้นสะดวก แต่ก็อาจทำให้เกิดค่าล้น การตัดเศษ และปัญหาเรื่องเครื่องหมายได้ บทเรียนนี้จะครอบคลุมจุดพลาดเหล่านี้
#include <stdio.h>
int main(void) {
printf("Beware silent conversions\n");
return 0;
}จำนวนเต็มล้น
การกำหนดค่าที่ใหญ่เกินกว่าชนิดจำนวนเต็มเป้าหมายจะรองรับ อาจทำให้ค่าวนรอบหรือข้อมูลสูญหาย
#include <stdio.h>
#include <limits.h>
int main(void) {
int max = INT_MAX;
printf("INT_MAX = %d\n", max);
return 0;
}การตัดทอนเมื่อลดขนาดชนิด
เมื่อเก็บค่าขนาดใหญ่ในชนิดที่เล็กกว่า จะเหลือเพียงบิตล่าง ทำให้ตัวเลขเสียหายโดยไม่มีการแจ้งเตือน
#include <stdio.h>
int main(void) {
int big = 300;
unsigned char small = (unsigned char)big;
printf("small = %d\n", small);
return 0;
}การผสมชนิดมีเครื่องหมายกับไม่มีเครื่องหมาย
การผสมชนิดมีเครื่องหมายกับชนิดไม่มีเครื่องหมายจะเปลี่ยนค่าที่มีเครื่องหมายเป็นชนิดไม่มีเครื่องหมาย ทำให้ค่าลบกลายเป็นค่าบวกขนาดใหญ่มาก
#include <stdio.h>
int main(void) {
int a = -1;
unsigned int b = 1;
if (a > b)
printf("surprise: -1 > 1 as unsigned\n");
return 0;
}จุดพลาดของตัวนับลูป
ตัวนับลูปชนิด unsigned ที่ลดต่ำกว่าศูนย์จะวนรอบเป็นค่าขนาดใหญ่มาก ทำให้เกิดลูปไม่สิ้นสุด ควรใช้ตัวนับแบบมีเครื่องหมายเมื่อนับถอยหลัง
#include <stdio.h>
int main(void) {
for (int i = 3; i >= 0; i--)
printf("%d ", i);
printf("\n");
return 0;
}การสูญเสียค่าจาก float เป็น int
การแปลง float เป็น int จะทำให้ส่วนเศษหายไป หากค่าเกินช่วงของ int ผลลัพธ์จะไม่ถูกกำหนด
#include <stdio.h>
int main(void) {
double d = 3.99;
int n = (int)d;
printf("n = %d\n", n);
return 0;
}การสูญเสียความละเอียดจาก double เป็น float
การเก็บ double ที่มีความละเอียดสูงไว้ใน float จะทำให้หลักตัวเลขหายไป และความคลาดเคลื่อนอาจสะสมในการคำนวณระยะยาว
#include <stdio.h>
int main(void) {
double d = 1.123456789012345;
float f = (float)d;
printf("%.7f\n", f);
return 0;
}ความประหลาดใจเรื่องเครื่องหมายของ char
การที่ char จะมีเครื่องหมายหรือไม่นั้นขึ้นอยู่กับการกำหนดของแต่ละการใช้งาน ควรใช้ unsigned char สำหรับค่าไบต์เพื่อหลีกเลี่ยงผลลัพธ์ติดลบ
#include <stdio.h>
int main(void) {
unsigned char b = 200;
printf("b = %d\n", b);
return 0;
}หารก่อนแล้วค่อยแปลง
การหารจำนวนเต็มก่อนแล้วจึงแคสต์ ไม่สามารถกู้ส่วนเศษที่หายไปกลับคืนมาได้ ควรแคสต์ก่อนหาร
#include <stdio.h>
int main(void) {
int a = 7, b = 2;
double wrong = (double)(a / b);
double right = (double)a / b;
printf("%.1f vs %.1f\n", wrong, right);
return 0;
}การเปรียบเทียบช่วงค่า
ใช้ค่าคงที่ใน limits.h เพื่อทำความเข้าใจช่วงค่าที่ชนิดหนึ่งรองรับได้ ก่อนสรุปว่าค่านั้นเก็บได้
#include <stdio.h>
#include <limits.h>
int main(void) {
printf("char range: %d to %d\n", CHAR_MIN, CHAR_MAX);
return 0;
}การแปลงอย่างรอบคอบ
ตรวจสอบช่วงค่าก่อนลดขนาดชนิด เลือกใช้ชนิดที่กว้างกว่าเมื่อไม่แน่ใจ และเขียนการแคสต์อย่างชัดเจนเพื่อให้เจตนาไม่คลุมเครือ
#include <stdio.h>
int main(void) {
long value = 200;
if (value >= 0 && value <= 255)
printf("fits in a byte: %ld\n", value);
return 0;
}ตรวจสอบอย่างรวดเร็ว
ทดสอบความเข้าใจเกี่ยวกับจุดพลาดของการแปลง
สรุป: จุดพลาดของการแปลง
คุณได้เรียนรู้ถึงอันตรายของการแปลงโดยไม่แจ้งเตือนแล้ว
- การลดขนาดชนิดอาจทำให้ค่าล้นหรือตัดเศษ
- การผสมชนิดมีเครื่องหมายและไม่มีเครื่องหมายทำให้ผลการเปรียบเทียบเปลี่ยนไป
- ตัวนับชนิด unsigned จะวนรอบเมื่อต่ำกว่าศูนย์
- แคสต์ก่อนหารเพื่อคงส่วนเศษไว้
- ตรวจสอบช่วงค่าและเขียนการแคสต์อย่างชัดเจน
คำถามที่พบบ่อย
บทเรียน “ข้อผิดพลาดในการแปลง” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “ข้อผิดพลาดในการแปลง” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส C Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส C Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “ข้อผิดพลาดในการแปลง”
ค่าล้นและการตัดทอน คุณปฏิบัติ C Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน C Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน C Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน
บทเรียน “ข้อผิดพลาดในการแปลง” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน C Academy นี้ได้ไหม
ได้ บทเรียน C Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การแปลงโดยนัย
- การแคสต์โดยชัดแจ้ง
- การแปลงจำนวนเต็มและจำนวนทศนิยม
- ข้อผิดพลาดในการแปลง