30/09/2018, 16:48
Giải thích cách printf với %ld %d %f đối với kiểu long int, int, float?
#include <stdio.h>
#include <conio.h>
void main()
{
long int li; int i; float f; clrscr();
li = 0x123456; f = 123.456;
i = (int) li;
printf("
li = %ld; i = %d",li,i);
i = (int) f;
printf("
f = %f; i = %d",f,i);
getch();
}
Kết quả :
li=1193046; i=13398
f=123.456001; i=123
Mình đã có kết quả nhưng chưa hiểu nó được tính bằng cách nào và công thức ra sao. Ai biết thì trả lời giúp. Cảm ơn !
Bài liên quan





Đây không phải là tính, mà chỉ là in ra thôi. Ta hiểu như sau
licó kiểulong intnhận vào là0x123456với tiền tố0xthì C hiểu đây là số hệ 16. Thử lấy máy tính đổi hệ 160x123456xem có ra giống kết quả chương trình này in ra không?Ta thấy
icó kiểuint. Trong trường hợp nàyintchỉ có 4 bytes thôi. Trong khi số0x123456có tới 6 bytes. Thế nên C sẽ chỉ lấy 4 bytes thấp, tức0x3456. Lấy máy tính bấm0x3456hệ 16 đổi sang hệ 10 ta được13398flà 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ìfloatlà 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ụngfloatthì 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.double f;Trường hợp cuối:
Lý do là
iđược gán bằngf. Phần lẻ phía sau sẽ bị bỏ đi.ichỉ nhận phần nguyên.Kiểu int chỉ có 2 byte chứ mấy anh @ltd. ?
Ngày trước thì
intlà 2 Bytes, nhưng bây giờ thìintđã là 4 bytes trên hầu hết các thể loại máy rồi.P/S: Em muốn quote bài thì em bôi đen đoạn muốn Quote và bấm Quote Reply.