Portál AbcLinuxu, 12. května 2025 04:28
off64_t cislo = 1024*1024*1024*6; char buffer[500]; sprintf( buffer, "%llu", cislo );Ukáže to 2147483648, což není správně.
test.c:10: warning: integer overflow in expression test.c:10: warning: overflow in implicit constant conversionMusíte alespoň za jedno číslo přidat ULL.
$ ./test 6442450944
sprintf(buffer, "%.0lf", (double) cislo);
off_t
je z podstaty věci také znaménkový.
off64_t
samozřejmě také.
off64_t cislo = 1024*1024*1024*6; char buffer[500]; sprintf( buffer, "%lld", cislo );=-2147483648 = Špatně
off64_t cislo = 1024LL*1024LL*1024LL*6LL; char buffer[500]; sprintf( buffer, "%lld", cislo );=-2147483648 = Špatně
off64_t cislo = 1024*1024*1024*6; char buffer[500]; sprintf( buffer, "%.0lf", (double)cislo );=-2147483648 = Špatně
off64_t cislo = 1024LL*1024LL*1024LL*6LL; char buffer[500]; sprintf( buffer, "%.0lf", (double)cislo );=6442450944 = OK
PRId64
', jak jsem vám poradil dříve?
sprintf( buffer, PRId64, cislo );
, tak mi to ukázalo chybu, že proměnná není definována. Pak jsem se kouknul do toho hlavičkového souboru a zjistil, že musím před hlavičkový soubor připsat #define __STDC_FORMAT_MACROS
. Poté se ale do bufferu dal řetězec "I64d". Pak jsem vyzkoušel sprintf( buffer, "%I64d", cislo);
a ono to funguje /* 7.8.1 Macros for format specifiers * * MS runtime does not yet understand C9x standard "ll" * length specifier. It appears to treat "ll" as "l". * The non-standard I64 length specifier causes warning in GCC, * but understood by MS runtime functions. */A pak mi nemá fungovat %lld a %llu.
#include <inttypes.h> ... printf(PRId64, cislo);
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.