Type Casting ในภาษา C เรื่องของ Signed / Unsigned

วันนี้อาจารย์พี่ปรึกษาได้กรุณาชี้แจง Bug ที่พบใหม่ให้ทราบ เห็นแล้วน่าสยองมาก เป็นเรื่องของความไม่เข้าใจกันระหว่าง เรา กับ gcc .. เชิญทรรศนาจาก

#include <stdio.h>
#include <stdint.h>

int main()
{
char x = 255;
uint16_t y = x;
uint16_t z = (uint8_t)x;

printf(“without casting %d\n”     “with casting %d\n”,  y, z);

return 0;
}

คิดว่า printf จะแสดง y, z เท่าไร ?..

จากการทำทดสอบ จะแสดงค่าดังนี้

without casting 65535

with casting 255

เนื่องจากการทำ y = x หรือ y = (uint16_t)x นั้น จะเริ่มจากการทำให้ x กลายเป็น 16-bit ก่อน
ซึ่งกรณีที่ x เป็น sign ตัว gcc จะพยายาม maintain เครื่องหมายลบเข้าไว้ แม้จะเปลี่ยนจาก 8-bit เป็นเป็น 16-bit

ดังนั้น -1 (หรือ 255) ของ x 8-bit เมื่อโตไปเป็น 16-bit จึงยังเป็น -1 อยู่ .. แต่เป็น -1 หรือ 65535 นั่นเอง

ทางแก้ จึงทำโดย casting ตัว signed / unsigned ก่อน แล้วเมื่อเปลี่ยนจาก 8-bit ไปเป็น 16-bit จึงไม่มีผิดพลาด
โดยใช้ (uint8_t)x ให้เป็น unsigned 8-bit ก่อน นั่นเอง

Advertisements

ใส่ความเห็น

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / เปลี่ยนแปลง )

Twitter picture

You are commenting using your Twitter account. Log Out / เปลี่ยนแปลง )

Facebook photo

You are commenting using your Facebook account. Log Out / เปลี่ยนแปลง )

Google+ photo

You are commenting using your Google+ account. Log Out / เปลี่ยนแปลง )

Connecting to %s