0Pricing
C Academy · บทเรียน

ข้อผิดพลาดในการแปลง

ค่าล้นและการตัดทอน

ข้อผิดพลาดในการแปลง เป็นบทเรียน 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. การแปลงโดยนัย
  2. การแคสต์โดยชัดแจ้ง
  3. การแปลงจำนวนเต็มและจำนวนทศนิยม
  4. ข้อผิดพลาดในการแปลง
← กลับไปที่ C Academy