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.
em vô đây mà đọc nè:
https://en.cppreference.com/w/c/language/operator_arithmetic#Arithmetic_addition_and_subtraction
https://en.cppreference.com/w/c/language/conversion#Usual_arithmetic_conversions
https://en.cppreference.com/w/c/language/conversion#Integer_promotions
vậy thì
char + char
trong C trước tiên 2 ôngchar
ở vế trái và vế phải được promote lên thànhint
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