#include <stdio.h>
#include <string.h>
#include <iostream>
char* ll2str(long long int x,char* buf){ // buf size min 21
int s=x<0;
if(x==0x8000000000000000LL){ // *(-1) jest out of range
strcpy(buf,"-9223372036854775808");
return buf;
}
char* p=buf+20;
*p=0;
if(s){
// fprintf(stderr,"0: %d %lld\n",s,x);
x=-x;
// fprintf(stderr,"1: %d %lld\n",s,x);
}
// fprintf(stderr,"2: %d %lld\n",s,x);
do{
*(--p)='0'+(x%10);
// fprintf(stderr,"3: %c\n",*p);
x/=10;
}while(x);
if(s)*(--p)='-';
return p;
}
int main(){
long long x;
// u mnie ponizsze dobrze dzialaja
x=0xffffffffffffffffLL;
printf("The number is: %llu\n",x);
x=0x8000000000000001LL;
printf("The number is: %lld\n",x);
x=0x8000000000000000LL;
printf("The number is: %lld\n",x);
//jak nie kijem go to pala
char buf[21];
printf("buffer: %s\n",ll2str(x,buf));
x=0x8000000000000001LL;
printf("buffer: %s\n",ll2str(x,buf));
x=0xffffffffffffffffLL;
printf("buffer: %s\n",ll2str(x,buf));
x=0;
printf("buffer: %s\n",ll2str(x,buf));
return 0;
}
Przy zalozeniu ze long long ma rozmiar 8 bajtow, inaczej warunek na zakres maksymalnej ujemnej bierze w leb. jesli by warunek wyrzucic, to funkcja nie bedzie dzialac dla LLONG_MIN (-LLONG_MAX - 1LL) - kod spod gcc 4.3.4 nie zmienia znaku.
ewentualnie wersja (jesli sie uwzgledni rowniez logarytm) niezalezna od rozmiaru
char* ll2str(long long int x,char* buf){ // buf size min 21
int s=x<0;
char* p=buf+20; // policzyc logarytm dziesietny z LLONG_MAX, zaokraglic w gore i dodac 2
*p=0;
do{
int r=x%10;
*(--p)='0'+(r>=0?r:-r);
x/=10;
}while(x);
if(s)*(--p)='-';
return p;
}