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
li
có kiểulong 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ệ 160x123456
xem có ra giống kết quả chương trình này in ra không?Ta thấy
i
có kiểuint
. Trong trường hợp nàyint
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ức0x3456
. Lấy máy tính bấm0x3456
hệ 16 đổi sang hệ 10 ta được13398
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ụngfloat
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.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.i
chỉ nhận phần nguyên.Kiểu int chỉ có 2 byte chứ mấy anh @ltd. ?
Ngày trước thì
int
là 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.