Đâ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.