嵌入式系统中的c-Long-to-char转换函数
我正在使用嵌入式系统,我需要实现一种将long转换为char的方法 问题是我不能在这个系统中使用sprintf来实现这一点,所以我正在寻找替代方法/功能来实现这一点 欢迎对LongLongToChar功能的实现提出建议。谷歌“itoa”。有很多变化。这里有一个例子嵌入式系统中的c-Long-to-char转换函数,c,char,long-integer,C,Char,Long Integer,我正在使用嵌入式系统,我需要实现一种将long转换为char的方法 问题是我不能在这个系统中使用sprintf来实现这一点,所以我正在寻找替代方法/功能来实现这一点 欢迎对LongLongToChar功能的实现提出建议。谷歌“itoa”。有很多变化。这里有一个例子 char* itoa(int val, int base){ static char buf[32] = {0}; int i = 30; for(; val && i ; --i, va
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));
}
#包括
#包括
字符*lltoa(长-长val,整数基){
静态字符buf[64]={0};
int i=62;
int符号=(val<0);
如果(符号)val=-val;
如果(val==0)返回“0”;
对于(;val&&i;--i,val/=base){
buf[i]=“0123456789abcdef”[val%基数];
}
如果(签名){
buf[i--]='-';
}
返回和基本单位[i+1];
}
int main(){
长a=LLONG_最大值;
长b=LLONG_MIN+1;
长c=23;
printf(“%ld\n”,sizeof(a));
printf(“最大“%s”\n”,lltoa(a,10));
printf(“最小“%s”\n”,lltoa(b,10));
printf(“-1'%s'\n”,lltoa((long-long)-1,10));
printf(“23'%s'\n”,lltoa(c,10));
}
谷歌“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));
}
#包括
#包括
字符*lltoa(长-长val,整数基){
静态字符buf[64]={0};
int i=62;
int符号=(val<0);
如果(符号)val=-val;
如果(val==0)返回“0”;
对于(;val&&i;--i,val/=base){
buf[i]=“0123456789abcdef”[val%基数];
}
如果(签名){
buf[i--]='-';
}
返回和基本单位[i+1];
}
int main(){
长a=LLONG_最大值;
长b=LLONG_MIN+1;
长c=23;
printf(“%ld\n”,sizeof(a));
printf(“最大“%s”\n”,lltoa(a,10));
printf(“最小“%s”\n”,lltoa(b,10));
printf(“-1'%s'\n”,lltoa((long-long)-1,10));
printf(“23'%s'\n”,lltoa(c,10));
}
使用lldiv()
,在单独的/
和%
在整个
long-long
范围内运行良好,包括0
和讨厌的long\u-long\u-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;
}
const char*ToString(长i){
静态字符缓冲区[sizeof(i)*3+1];//大小可能会更紧一些
char*p=&buffer[sizeof(buffer)];
*(-p)='\0';
lldiv_t qr;
qr.quot=i;
做{
qr=lldiv(qr.quot,10);
*(-p)=abs(qr.rem)+“0”;
}while(qr.quot);
if(i<0){
*(-p)='-';
}
返回p;
}
使用lldiv()
,在单独的/
和%
在整个
long-long
范围内运行良好,包括0
和讨厌的long\u-long\u-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;
}
const char*ToString(长i){
静态字符缓冲区[sizeof(i)*3+1];//大小可能会更紧一些
char*p=&buffer[sizeof(buffer)];
*(-p)='\0';
lldiv_t qr;
qr.quot=i;
做{
qr=lldiv(qr.quot,10);
*(-p)=abs(qr.rem)+“0”;
}while(qr.quot);
if(i<0){
*(-p)='-';
}
返回p;
}
您可能希望base=10。这将与sprintf中的%d相同。注意缓冲区的大小,不要忘记减号。@chux,很好。谢谢那太尴尬了。这就是我为复制代码所得到的。@ Charlie Burns <代码>长Lo/<代码>至少有64位,而在BASIC 2中,您可能需要<代码> Buf(64)< />代码> i=30+32 < /COD>。@ MaunelCyBRA:如果您不需要BASE 10(对于用户),则应该考虑与基16(十六进制)进行绑定,因为“分割”。在嵌入式MCU上,移位要比除法便宜得多(除法必须由编译器导入的库例程完成)。如果你不能适应sprintf
,你可能也不想拖入大整数除法。@Ben Jackson同意“大整数除法”在嵌入式系统中的时间开销可能很大,但sprintf
在空间和时间上都可能很大。了解OP的空间/时间需求将有助于引导问题。您可能希望base=10。这将与sprintf中的%d相同。注意缓冲区的大小,不要忘记减号。@chux,很好。谢谢那太尴尬了。这就是我为复制代码所得到的。@ Charlie Burns <代码>长Lo/<代码>至少有64位,而在BASIC 2中,您可能需要<代码> Buf(64)< />代码> i=30+32 < /COD>。@ MaunelCyBRA:如果您不需要BASE 10(对于用户),则应该考虑与基16(十六进制)进行绑定,因为“分割”。在嵌入式MCU上,移位要比除法便宜得多(除法必须由编译器导入的库例程完成)。如果你不能适应sprintf
,你可能也不想拖入大整数除法。@Ben Jackson同意“大整数除法”在嵌入式系统中的时间开销可能很大,但sprintf
在空间和时间上都可能很大。了解OP的空间/时间需求将有助于引导问题。