-1

我正在制作一个将十进制转换为十六进制的 C 程序。我的程序似乎适用于较小的数字,例如314156存储在 long int 但较大的数字,例如11806310474565or 8526495043095935640always return back 0x7FFFFFFF。如何处理或存储大于2147483647/的数字2^32。我尝试过使用long longand 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用作编译器。

4

3 回答 3

1

你想要atoll(),没有atoi()。阅读文档。

(披露:我停止阅读您的代码atoi。)

于 2017-09-21T03:02:50.567 回答
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];
于 2017-09-21T03:05:12.390 回答
0

将字符串转换为unsigned long longwith strtoull()@蓝精灵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];
于 2017-09-21T04:14:42.887 回答