【发布时间】:2013-09-17 19:17:42
【问题描述】:
我正在使用嵌入式系统,我需要实现一种将 long long 转换为 char 的方法。
问题是我不能在这个系统中使用 sprintf 来做到这一点,所以我正在寻找替代方法/功能来实现它。
欢迎提出 LongLongToChar 函数的实现建议。
【问题讨论】:
标签: c char long-integer
我正在使用嵌入式系统,我需要实现一种将 long long 转换为 char 的方法。
问题是我不能在这个系统中使用 sprintf 来做到这一点,所以我正在寻找替代方法/功能来实现它。
欢迎提出 LongLongToChar 函数的实现建议。
【问题讨论】:
标签: c char long-integer
谷歌“itoa”。有很多变化。这是一个例子。
char* itoa(int val, int base){
static char buf[32] = {0};
int i = 30;
for(; val && i ; --i, val /= base)
buf[i] = "0123456789abcdef"[val % base];
return &buf[i+1];
}
具体来说,这里是一个“lltoa”。
#include <stdio.h>
#include <limits.h>
char* lltoa(long long val, int base){
static char buf[64] = {0};
int i = 62;
int sign = (val < 0);
if(sign) val = -val;
if(val == 0) return "0";
for(; val && i ; --i, val /= base) {
buf[i] = "0123456789abcdef"[val % base];
}
if(sign) {
buf[i--] = '-';
}
return &buf[i+1];
}
int main() {
long long a = LLONG_MAX;
long long b = LLONG_MIN + 1;
long long c = 23;
printf("%ld\n", sizeof(a));
printf("max '%s'\n", lltoa(a, 10));
printf("min '%s'\n", lltoa(b, 10));
printf("-1 '%s'\n", lltoa((long long)-1, 10));
printf("23 '%s'\n", lltoa(c, 10));
}
【讨论】:
long long 至少为 64 位,基数为 2,您可能需要 buf[64] 和 i = 30+32。
sprintf,你可能也不想拖入大整数除法。
sprintf 在空间和时间上都可能巨大。了解 OP 的空间/时间需求将有助于解决问题。
使用lldiv(),在单独的/ 和% 上节省CPU 时间。
适用于整个long long 范围,包括0 和讨厌的LONG_LONG_MIN。
const char *ToString(long long i) {
static char buffer[sizeof(i)*3 + 1]; // Size could be a bit tighter
char *p = &buffer[sizeof(buffer)];
*(--p) = '\0';
lldiv_t qr;
qr.quot = i;
do {
qr = lldiv(qr.quot, 10);
*(--p) = abs(qr.rem) + '0';
} while (qr.quot);
if (i < 0) {
*(--p) = '-';
}
return p;
}
【讨论】: