01/10/2018, 17:23

Kiểu dữ liệu mặc định trả về của phép cộng trong C

Chào mọi người
Chuyện là mình đang viết một cái hàm nho nhỏ để check overflow của phép cộng của hai số
code vd:

typdef unsigned char uchar;
int uadd_ok(uchar a, uchar b) {
return !((a + b) < a); 
}

mình chạy code trên với a = 255, b = 255 trả về 1
mà đáng lý ra phải là 0
nên mình sửa lại chỗ return thành:
return !((uchar)(a + b) < 0));
kết quả như mong đợi, bằng 0

lọ mọ một hồi thì mình quyết định thử:
printf("%du ", sizeof(a + b));
kết quả trả về lại bằng 4 (int trong máy 64 bít)

Cho mình hỏi đây có phải tiêu chuẩn của thằng C hay không hay là cách thằng compiler nó implement như vậy hay là phụ thuộc vào từng kiến trúc máy.
Xin cảm ơn.

viết 19:29 ngày 01/10/2018

em vô đây mà đọc nè:

https://en.cppreference.com/w/c/language/operator_arithmetic#Arithmetic_addition_and_subtraction

  • first, usual arithmetic conversions are performed

https://en.cppreference.com/w/c/language/conversion#Usual_arithmetic_conversions

  1. Otherwise, both operands are integers. In that case, first of all, both operands undergo integer promotions

https://en.cppreference.com/w/c/language/conversion#Integer_promotions

Integer promotion is the implicit conversion of a value of any integer type with rank less or equal to rank of int or of a bit field of type _Bool, int, signed int, unsigned int, to the value of type int or unsigned int

vậy thì char + char trong C trước tiên 2 ông char ở vế trái và vế phải được promote lên thành int

255 (int, promoted) + 255 (int, promoted) = 510 (int). 510 ko bị ép kiểu thành char mà được đem so sánh với 255 kia luôn, dẫn tới kết quả như trên

Bài liên quan
0