十进制到十六进制转换 (C) 不适用于大数字
Decimal to Hex conversion (C) is not working for large numbers
我正在编写一个 C 程序来将十进制转换为十六进制。我的程序似乎适用于存储在 long int 中的较小数字,如 314156
,但较大的数字,如 11806310474565
或 8526495043095935640
总是 return 返回 0x7FFFFFFF
。我如何处理或存储大于 2147483647
/ 2^32
的数字。我试过使用 long long
和 unsigned long long
,但我的代码无法正常工作。
代码:
#include <stdio.h>
#include <stdlib.h>
int main( int argc, char* argv[] ){
if(argc != 2 ){
printf("Usage: %s requires one parameter\n", argv [0]);
return 1;
}
unsigned long long decimal = atoi(argv[1]);
int count = 0, count2 = 0, value = decimal;
char hex[100];
for( ; value!=0 ; value/=10 )
count++;
unsigned long long q = decimal;
int i = 0, r = 0;
while( q != 0){
q = decimal/16;
r = decimal%16;
printf("%*llu = %*llu * 16 + %*d (%X)\n", count, decimal, count, q, 3, r, r);
hex[i++] = r<10 ? r+48 : r+55;
decimal = q;
}
printf("0x");
for(i-- ; i>=0; i--){
printf("%c",hex[i]);
}
printf("\n");
return 0;
}
我正在使用 gcc
作为编译器。
你想要 atoll()
,而不是 atoi()
。阅读文档。
(披露:我在 atoi
时停止阅读您的代码。)
I've tried using long long and unsigned long long, but those aren't working properly with my code.
它们需要一组不同的函数。如果您使用 atoi
来解析一个非常大的数字,您将得到 MAX_INT
值,解释 0x7FFFFFFF
输出。
您需要将函数替换为atoll
:
unsigned long long decimal = atoll(argv[1]);
注:这里使用"magic numbers"
hex[i++] = r<10 ? r+48 : r+55;
不理想。最好写
hex[i++] = r<10 ? r+'0' : r+'A'-10;
甚至
hex[i++] = "0123456789ABCDEF"[r];
使用 strtoull()
将字符串转换为 unsigned long long
。 。当结果应为 > LLONG_MAX
.
时,atoll()
失败
unsigned long long decimal = strtoull(argv[1], (char **)NULL, 10);
改变类型
unsigned long long decimal = ...;
// int value = decimal;
unsigned long long value = decimal;
代码输入有问题"0"
。它只是打印 "0x"
改变
while( q != 0){
...
}
// to
do {
...
} while( q != 0);
--
为清楚起见,推荐
// hex[i++] = r<10 ? r+48 : r+55;
hex[i++] = r<10 ? r+'0' : r+'A'-10;
// or
hex[i++] = "0123456789ABCDEF"[r];
我正在编写一个 C 程序来将十进制转换为十六进制。我的程序似乎适用于存储在 long int 中的较小数字,如 314156
,但较大的数字,如 11806310474565
或 8526495043095935640
总是 return 返回 0x7FFFFFFF
。我如何处理或存储大于 2147483647
/ 2^32
的数字。我试过使用 long long
和 unsigned long long
,但我的代码无法正常工作。
代码:
#include <stdio.h>
#include <stdlib.h>
int main( int argc, char* argv[] ){
if(argc != 2 ){
printf("Usage: %s requires one parameter\n", argv [0]);
return 1;
}
unsigned long long decimal = atoi(argv[1]);
int count = 0, count2 = 0, value = decimal;
char hex[100];
for( ; value!=0 ; value/=10 )
count++;
unsigned long long q = decimal;
int i = 0, r = 0;
while( q != 0){
q = decimal/16;
r = decimal%16;
printf("%*llu = %*llu * 16 + %*d (%X)\n", count, decimal, count, q, 3, r, r);
hex[i++] = r<10 ? r+48 : r+55;
decimal = q;
}
printf("0x");
for(i-- ; i>=0; i--){
printf("%c",hex[i]);
}
printf("\n");
return 0;
}
我正在使用 gcc
作为编译器。
你想要 atoll()
,而不是 atoi()
。阅读文档。
(披露:我在 atoi
时停止阅读您的代码。)
I've tried using long long and unsigned long long, but those aren't working properly with my code.
它们需要一组不同的函数。如果您使用 atoi
来解析一个非常大的数字,您将得到 MAX_INT
值,解释 0x7FFFFFFF
输出。
您需要将函数替换为atoll
:
unsigned long long decimal = atoll(argv[1]);
注:这里使用"magic numbers"
hex[i++] = r<10 ? r+48 : r+55;
不理想。最好写
hex[i++] = r<10 ? r+'0' : r+'A'-10;
甚至
hex[i++] = "0123456789ABCDEF"[r];
使用 strtoull()
将字符串转换为 unsigned long long
。 LLONG_MAX
.
atoll()
失败
unsigned long long decimal = strtoull(argv[1], (char **)NULL, 10);
改变类型
unsigned long long decimal = ...;
// int value = decimal;
unsigned long long value = decimal;
代码输入有问题"0"
。它只是打印 "0x"
改变
while( q != 0){
...
}
// to
do {
...
} while( q != 0);
--
为清楚起见,推荐
// hex[i++] = r<10 ? r+48 : r+55;
hex[i++] = r<10 ? r+'0' : r+'A'-10;
// or
hex[i++] = "0123456789ABCDEF"[r];