user-0 提问: 在不支持64位数据类型的环境中，如何把两个32位数表示的64位数据转换成十进制? 

回复:
user: user-1
content: 引用 6 楼 JerKii 的回复:我倒是想到一个办法，不过如果数据太大，性能可能会是问题  你怎么知道性能会是问题？你测试过了？ printf, sprintf什么的可能都是类似的写法，也没见几个说性能太差

user: user-1
content: 引用 3 楼 cfjtaishan 的回复:[quote=引用 2 楼 JerKii 的回复:]  谢谢~~~ 但是我没有sprintf这类函数可以使用。即使有，他也不支持 %llx 。  [quote=引用 1 楼 cfjtaishan 的回复:] #include <stdio.h>   int main(void) {      unsigned int h32 = 0xd;      unsigned int l32 = 0xBDA6FC24;      unsigned long long u64;      char u64tostring[32];       u64 = 0xd;      u64 = (u64 << 32) + l32;       printf("u64 = %llu\n", u64);       sprintf(u64tostring, "%llu", u64);      puts(u64tostring);       return 0; } 在32为系统里，long long类型是8个字节（64位），所以可以满足你的需求；[/quote] 不会吧，怎么还有sprintf，但是不支持%llu的？那么直接用u64的形式吧，通过移位得到一个64位的数据。[/quote] C90编译器？不会都不支持long long吧。。

user: user-0
content: 找到一篇文章，跟大家分析一下 http://blog.csdn.net/zhaopeng2511/article/details/6766804

user: user-0
content: 事实上我不是在c里面实现这个功能。我需要在一个嵌入式lua里面实现64位数据的十进制输出。而且当前嵌入式设备里面使用的lua不支持64位数据的操作。  我倒是想到一个办法，不过如果数据太大，性能可能会是问题： int u64tostring(unsigned int hi32, unsigned int lo32, char *buf, int blen) {     unsigned int HH = hi32, LL = lo32;     unsigned int H = 0, L = 0, t, n = 0, len = 0, i;     do     {         do         {             t = lo32 / 10;             lo32 %= 10;             if (t > 0xffffffff - L)                 H += 1;             L += t;              if (hi32 == 0)                 break;             hi32 -= 1;             lo32 = 0xffffffff - 10 + lo32 + 1;             n += 1;         } while (1);         if (n > 0xffffffff - L)             H += 1;         L += n;         buf[blen - ++len] = lo32 + '0';         hi32 = H;         lo32 = L;         H = L = n = 0;     } while (hi32 || lo32);      buf[len] = 0;     printf("\r\n ==> %x-%08x : %s", HH, LL, buf);     return len; } 引用 4 楼 vnvlyp 的回复:[quote=引用 3 楼 cfjtaishan 的回复:] [quote=引用 2 楼 JerKii 的回复:]  谢谢~~~ 但是我没有sprintf这类函数可以使用。即使有，他也不支持 %llx 。  [quote=引用 1 楼 cfjtaishan 的回复:] #include <stdio.h>   int main(void) {      unsigned int h32 = 0xd;      unsigned int l32 = 0xBDA6FC24;      unsigned long long u64;      char u64tostring[32];       u64 = 0xd;      u64 = (u64 << 32) + l32;       printf("u64 = %llu\n", u64);       sprintf(u64tostring, "%llu", u64);      puts(u64tostring);       return 0; } 在32为系统里，long long类型是8个字节（64位），所以可以满足你的需求；[/quote] 不会吧，怎么还有sprintf，但是不支持%llu的？那么直接用u64的形式吧，通过移位得到一个64位的数据。[/quote] C90编译器？不会都不支持long long吧。。[/quote]

user: user-2
content: 最好使用标准的64位类型   如果你要自己做，就是  union u64 { struct { int high; int low; }a; long long b; };

user: user-3
content: 引用 2 楼 JerKii 的回复:谢谢~~~ 但是我没有sprintf这类函数可以使用。即使有，他也不支持 %llx 。  [quote=引用 1 楼 cfjtaishan 的回复:] #include <stdio.h>   int main(void) {      unsigned int h32 = 0xd;      unsigned int l32 = 0xBDA6FC24;      unsigned long long u64;      char u64tostring[32];       u64 = 0xd;      u64 = (u64 << 32) + l32;       printf("u64 = %llu\n", u64);       sprintf(u64tostring, "%llu", u64);      puts(u64tostring);       return 0; } 在32为系统里，long long类型是8个字节（64位），所以可以满足你的需求；[/quote] 不会吧，怎么还有sprintf，但是不支持%llu的？那么直接用u64的形式吧，通过移位得到一个64位的数据。

user: user-0
content: 谢谢~~~ 但是我没有sprintf这类函数可以使用。即使有，他也不支持 %llx 。  引用 1 楼 cfjtaishan 的回复:#include <stdio.h>   int main(void) {      unsigned int h32 = 0xd;      unsigned int l32 = 0xBDA6FC24;      unsigned long long u64;      char u64tostring[32];       u64 = 0xd;      u64 = (u64 << 32) + l32;       printf("u64 = %llu\n", u64);       sprintf(u64tostring, "%llu", u64);      puts(u64tostring);       return 0; } 在32为系统里，long long类型是8个字节（64位），所以可以满足你的需求；

user: user-3
content: #include <stdio.h>   int main(void) {      unsigned int h32 = 0xd;      unsigned int l32 = 0xBDA6FC24;      unsigned long long u64;      char u64tostring[32];       u64 = 0xd;      u64 = (u64 << 32) + l32;       printf("u64 = %llu\n", u64);       sprintf(u64tostring, "%llu", u64);      puts(u64tostring);       return 0; } 在32为系统里，long long类型是8个字节（64位），所以可以满足你的需求；