我正在制作一个C程序,将十进制转换为十六进制。我的程序似乎适用于存储在long int中的较小数字,例如314156
,但11806310474565
或8526495043095935640
等较大数字始终返回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
作为编译器。
答案 0 :(得分:1)
您需要atoll()
,而不是atoi()
。阅读文档。
(披露:我在atoi
停止阅读您的代码。)
答案 1 :(得分:0)
我已尝试使用long long和unsigned long long,但这些代码与我的代码无法正常工作。
他们需要一组不同的功能。如果您使用atoi
来解析非常大的数字,则会获得MAX_INT
值,并解释0x7FFFFFFF
输出。
您需要按atoll
替换该功能:
unsigned long long decimal = atoll(argv[1]);
注意:在这里使用“幻数”
hex[i++] = r<10 ? r+48 : r+55;
不理想。最好写
hex[i++] = r<10 ? r+'0' : r+'A'-10;
甚至
hex[i++] = "0123456789ABCDEF"[r];
答案 2 :(得分:0)
使用unsigned long long
将字符串转换为strtoull()
。 @BLUEPIXY。如果结果应为&gt; atoll()
失败LLONG_MAX
。
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];