十进制到十六进制转换(C)不适用于大数

时间:2017-09-21 03:00:31

标签: c hex decimal unsigned-long-long-int long-long

我正在制作一个C程序,将十进制转换为十六进制。我的程序似乎适用于存储在long int中的较小数字,例如314156,但118063104745658526495043095935640等较大数字始终返回0x7FFFFFFF。如何处理或存储大于2147483647 / 2^32的数字。我已尝试使用long longunsigned 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作为编译器。

3 个答案:

答案 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];