zle printowanie printf long long int, cout dziala

0

Witam, moze mi ktos powiedziec dlaczego ten kod zwraca zly output?
W pliku dziwnee.txt pojawia sie:

The number from cout is: 12345678901
The number is: -539222987

a ja bardzo chcialbym wiedziec, co zrobic, aby wynik byl taki sam.

#include <stdio.h>
#include <iostream>
int main(int, char*) 
{  
	FILE*pFile;
pFile=freopen("dziwnee.txt","w",stdout);
long long int x = (long long int)12345678901LL;
std::cout<<"The number from cout is: "<<x<<std::endl;
printf("The number is: %lld\n",x); 
fclose(pFile);
system("start dziwnee.txt");
return 0;
}
0

A możesz zrobić sobie sizeof(long long int) i powiedzieć jaki masz wyniki? Bo nie wiem jak jest ze standardem long long'ów ale może być tak jak z long double...

0

Może dlatego, że w standardowym C++ średnio się long long znajduje?

0

sizeof(long long int) zwraca 8

uzywam kompilatora dostarczanego z (3.4.2?) dev-cpp 4.9.9.2

0

ustaw ow long long na 0x1234567812345678itp a potem sprobuj printf'em wyswietlic te liczbe jako lx albo llx. a potem sprobuj ja wyswietlic jako %x %x (tak, jako DWA). mozliwe ze implementacja printf w Twoim stdlib po prostu nie obsluguje 8b'owych integerow i zapomina rzucic bledem ze podano LL. jesli tak jest - wyswietlenie jej jako dwa hexy powinno "zadzialac". niestety, w dziesietnym tak tego nie zrobisz

0

Quetzalcoatl, kto jak kto, ale Ty powinieneś znać standard. Obecność long long w C++ to rozszerzenie, dopiero w C++0x wejdzie do standardu. A fakt, stdliby na Windows raczej średnio wspierają long long.

0

nie napisalem nigdzie ze jest? jak juz sie czepiasz, to predzej tego, ze kazalem jeden parametr jako dwa %x %x odczytac --- to dopiero jest platform specific!
smile:)

0
#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;
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1