[PL] scanf, printf and %llu (last update: 2013-11-17, created: 2013-11-17) back to the list ↑
WRT: http://forum.4programmers.net/Off-Topic/91494-programistyczne_wtf_jakie_was_spotkaly?p=989139#id989139

Na moje oko chodzi o support %llu w danej standardowej bibliotece C (glibc, msvcrt, etc).
Tj, jeśli biblioteka C nie obsługuje %llu, to traktuje to jak %u, a więc 64-bitową zmienną wypełnia tylko 32-bitami danych (a górne 32-bity pozostają bez zmian, a wiec w tym wypadku część zmiennej nie została zainicjowana.)

Nie wiem jak to szybko pod GNU/Linux sprawdzić, natomiast pod Windowsem możemy zrobić coś takiego:


#include <stdio.h>
#include <windows.h>

typedef int (*sscanf_type)(const char*,const char*,...);
typedef int (*printf_type)(const char*,...);

int main()
{
  const char *crt[] = {
    "msvcrt.dll",
    "msvcrt20.dll",
    "msvcr71.dll",
    "msvcr100.dll",
    "msvcr100d.dll",
    "msvcr110.dll",
    NULL
  };

  for(const char **p = crt; *p; p++) {
    HINSTANCE h = LoadLibrary(*p);
    if(h == NULL) {
      printf("Could not load: %s\n", *p);
      continue;
    }

    sscanf_type loaded_sscanf = (sscanf_type)GetProcAddress(h, "sscanf");
    printf_type loaded_printf = (printf_type)GetProcAddress(h, "printf");    
    if(loaded_sscanf && loaded_printf) {
      printf("-------------------- %s -------------------------\n", *p);
      unsigned long long x = ~0ULL;
      loaded_sscanf("13", "%llu",&x);
      while(x>0)
      {
          x/=2;
          loaded_printf("%llu\n",x);
      }

    } else {
      printf("Could not find sscanf/printf in: %s\n", *p);
    }

    FreeLibrary(h);
  }

    return 0;
}

Istotną część zaznaczyłem na żółto.

Wynik:


-------------------- msvcrt.dll -------------------------
6
3
1
0
-------------------- msvcrt20.dll -------------------------
2147483654
3221225475
3758096385
4026531840
4160749568
4227858432
4261412864
4278190080
4286578688
4290772992
4292870144
4293918720
4294443008
4294705152
4294836224
4294901760
4294934528
4294950912
4294959104
4294963200
4294965248
4294966272
4294966784
4294967040
4294967168
4294967232
4294967264
4294967280
4294967288
4294967292
4294967294
4294967295
2147483647
1073741823
536870911
268435455
134217727
67108863
33554431
16777215
8388607
4194303
2097151
1048575
524287
262143
131071
65535
32767
16383
8191
4095
2047
1023
511
255
127
63
31
15
7
3
1
0
-------------------- msvcr71.dll -------------------------
2147483654
3221225475
3758096385
4026531840
4160749568
4227858432
4261412864
4278190080
4286578688
4290772992
4292870144
4293918720
4294443008
4294705152
4294836224
4294901760
4294934528
4294950912
4294959104
4294963200
4294965248
4294966272
4294966784
4294967040
4294967168
4294967232
4294967264
4294967280
4294967288
4294967292
4294967294
4294967295
2147483647
1073741823
536870911
268435455
134217727
67108863
33554431
16777215
8388607
4194303
2097151
1048575
524287
262143
131071
65535
32767
16383
8191
4095
2047
1023
511
255
127
63
31
15
7
3
1
0
-------------------- msvcr100.dll -------------------------
6
3
1
0
-------------------- msvcr100d.dll -------------------------
6
3
1
0
-------------------- msvcr110.dll -------------------------
6
3
1
0

A więc jak widać support %llu jest w przypadku Windowsa raczej nowy (msvcr100 pojawiło się w okolicach Visty jeśli mnie pamięć nie myli).
【 design & art by Xa / Gynvael Coldwind 】 【 logo font (birdman regular) by utopiafonts / Dale Harris 】