Không tìm được lỗi trong chương trình chuyển đổi số thập phân sang số nhị phân và ngược lại
Xin chào. Mình có làm 1 đoạn code nhỏ để cho người dùng nhập vào một số thập phân và chuyển nó sang số nhị phân.
Nhưng có 1 điều vô lý là chương trình mình có giới hạn hay sao ấy? Nó chỉ cho kết quả đúng khi số nhập vào phải từ 0 => 1023. Còn khi nhập 1024 thì nó cho kết quả sai
Dưới đây là code:
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <math.h>
#include <Windows.h>
void DecimalBinary(int n);
void BinaryDecimal(int m);
int power(int coso, int somu);
int power(int coso, int somu)
{
int ketqua = 1;
for (int i = 1; i <= somu; i++)
ketqua*=coso;
return ketqua;
}
void DecimalBinary(int n)
{
if (n == 0)
printf("Ketqua: 0
");
else
{
int bienphu = 0;
int a[50];
int i = 0;
while (n != 0)
{
int digit = n%2;
n/=2;
a[i++] = digit;
bienphu++;
}
printf("Ket qua: ");
for (int x = bienphu-1; x >= 0; x--)
printf("%d",a[x]);
printf("
");
}
}
void BinaryDecimal(int m)
{
int tong = 0;
int chuso = log10(m)+1;
if (m == 0)
printf("Ketqua: 0
");
else
{
for (int i = 0; i < chuso; i++)
{
int sochu = m%10;
m/=10;
tong+=sochu*power(2,i);
}
printf("Ketqua: %d
",tong);
}
}
int main()
{
int n;
printf("Nhap so can doi sang he nhi phan: ");
scanf("%d",&n);
DecimalBinary(n);
int m;
printf("
Nhap so can doi sang he thap phan: ");
scanf("%d",&m);
BinaryDecimal(m);
getch();
return 0;
}
Để dễ kiểm chứng thì mình làm thêm cái hàm đổi ngược lại số nhị phân sang số thập phân. Để khi nhập 1 số thập phân rồi sau đó nhập số nhị phân để kiểm tra lại nhưng từ số 1024 trở đi thì bị lỗi.
Ai giúp mình nhé! Xin cảm ơn!
Input hệ 2 bị tràn rồi.
như 1024 = 10 000 000 000 (10 tỷ)
nhưng kiểu int max là 2^31 thôi tức cỡ 2,1 tỷ
Còn 1023 thì là 1 111 111 111 tức < 2,1 tỷ -> vẫn ok
-> Có thể dùng chuỗi để lưu trữ
Nhưng hệ 2 là ở hàm chuyển Binary sang Decimal mà anh? Nếu có tràn thì chỉ tràn ở hàm chuyển Binary sang Decimal thôi chứ nhỉ? Còn hàm Decimal sang Binary thì không có hệ 2 mà chỉ liên tục lấy chữ số cuối cùng thôi mà (nhưng vẫn sai)?
P/S: Em còn non nên nhiều cái chưa hiểu
Thì mình đang nói cái hệ 2 sang 10 á.
void BinaryDecimal(int m)
-> Khi bạn input hệ 2 có phải bạn nhập 101010101
Như 1024 = 10 000 000 000 (viết tách theo hệ 10 cho dễ nhìn) = 10 tỷ
-> Lớn hơn giá trị tối đa có thể lưu của int.
Vì kiểu int lưu trữ ở hệ 10. Tức bạn nhập 10101010 thì nó vẫn hiểu 10101010 của hệ 10 chứ không phải hệ 2.
Nên khi bạn nhập 10 000 000 000 thì C hiểu là 10 tỷ. Chứ ko phải là 1024.
À mà hàm hệ 10 sang hệ 2 mình test thấy ok mà nhỉ
À, đúng rồi. Cái hàm
void DecimalBinary(int n)
nó hoàn toàn đúng, chuyển không sai, có lẽ mình tính tay lộnChỉ có cái hàm
void BinaryDecimal(int m)
là sai thôiVậy thì có cách nào để C hiểu đó là số dạng binary không bạn? :)[quote=“drgnz, post:2, topic:25797”]
-> Có thể dùng chuỗi để lưu trữ
[/quote]
Mình không hiểu rõ cách này lắm Bạn có thể cho mình cái link tham khảo hoặc hướng dẫn trực tiếp cho mình không
Trong C thì theo mình biết ko có cách nào lưu trữ dưới dạng binary với kiểu primitive. :c
Nhưng dùng chuỗi là vầy
(code chưa test nhưng ý tưởng là vậy :)) )
Bạn tham khảo nhé