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

Decimal to Hex conversion (C) is not working for large numbers

我正在编写一个 C 程序来将十进制转换为十六进制。我的程序似乎适用于存储在 long int 中的较小数字,如 314156,但较大的数字,如 118063104745658526495043095935640 总是 return 返回 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 作为编译器。

你想要 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];