Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
嵌入式系统中的c-Long-to-char转换函数_C_Char_Long Integer - Fatal编程技术网

嵌入式系统中的c-Long-to-char转换函数

嵌入式系统中的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

我正在使用嵌入式系统,我需要实现一种将long转换为char的方法

问题是我不能在这个系统中使用sprintf来实现这一点,所以我正在寻找替代方法/功能来实现这一点

欢迎对LongLongToChar功能的实现提出建议。

谷歌“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));
}
谷歌“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的空间/时间需求将有助于引导问题。