Đây không phải là tính, mà chỉ là in ra thôi. Ta hiểu như sau
li = 0x123456
li
có kiểu long int
nhận vào là 0x123456
với tiền tố 0x
thì C hiểu đây là số hệ 16. Thử lấy máy tính đổi hệ 16 0x123456
xem có ra giống kết quả chương trình này in ra không?
i=13398
Ta thấy i
có kiểu int
. Trong trường hợp này int
chỉ có 4 bytes thôi. Trong khi số 0x123456
có tới 6 bytes. Thế nên C sẽ chỉ lấy 4 bytes thấp, tức 0x3456
. Lấy máy tính bấm 0x3456
hệ 16 đổi sang hệ 10 ta được 13398
f = 123.456;
f
là kiểu float, ta thấy giá trị nhập vào là 123.456
, tuy nhiên giá trị in ra lại là 123.456001
. Lý do bởi vì float
là số thực, trong C số thực gọi là Single-precision floating-point. Ta có thể hiểu “sơ sơ” là số thực không phải là một con số chính xác. Khi sử dụng float
thì C sẽ tự động “nâng cấp” float thành double. Double có độ chính xác gấp đôi float. Do việc chuyển đổi này sẽ phát sinh sai số, dẫn đến lòi ra số 1 ở cuối. Để giải quyết vấn đề này ta có hai giải pháp.
- Khai báo f ở dạng double ngay từ đầu:
double f
;
- Chỉ in ra 4 số lẻ ở phía sau (hoặc tổng phần chẵn và phần lẻ tầm 7 số thôi)
printf("\n f = %.4f; i = %d",f,i);
Trường hợp cuối:
i=123
Lý do là i
được gán bằng f
. Phần lẻ phía sau sẽ bị bỏ đi. i
chỉ nhận phần nguyên.