Jak se vám printf je unsigned long long int (formát specifikátor pro unsigned long long int)?

hlasů
286
#include <stdio.h>
int main() {
    unsigned long long int num = 285212672; //FYI: fits in 29 bits
    int normalInt = 5;
    printf(My number is %d bytes wide and its value is %ul. A normal number is %d.\n, sizeof(num), num, normalInt);
    return 0;
}

Výstup:

My number is 8 bytes wide and its value is 285212672l. A normal number is 0.

Předpokládám, že tento neočekávaný výsledek je při tisku unsigned long long int. Jak se vám ?printf()unsigned long long int

Položena 05/08/2008 v 21:59
zdroj uživatelem
V jiných jazycích...                            


11 odpovědí

hlasů
380

Pomocí LL (el-el) dlouholetou dlouhou modifikátor s U (bez znaménka) konverze. (Práce v oknech, GNU).

printf("%llu", 285212672);
Odpovězeno 05/08/2008 v 22:02
zdroj uživatelem

hlasů
71

Možná budete chtít zkusit pomocí inttypes.h knihovnu, která vám umožní typy, jako je int32_t, int64_t, uint64_tatd. Potom můžete použít jeho makra, jako například:

uint64_t x;
uint32_t y;

printf("x: %"PRId64", y: %"PRId32"\n", x, y);

To je „zaručené“, že nebude vám stejný problém jako long, unsigned long longetc, protože nemusíte hádat, kolik bitů je v každém typu dat.

Odpovězeno 12/08/2008 v 12:07
zdroj uživatelem

hlasů
34

Pro long (nebo __int64) pomocí MSVS, měli byste použít% I64d:

__int64 a;
time_t b;
...
fprintf(outFile,"%I64d,%I64d\n",a,b);    //I is capital i
Odpovězeno 06/09/2009 v 15:26
zdroj uživatelem

hlasů
30

%d-> pro int

%u-> pro unsigned int

%ld-> pro long int

%lu-> pro unsigned long int

%lld-> pro long long int

%llu-> pro unsigned long long int

Odpovězeno 13/05/2015 v 17:48
zdroj uživatelem

hlasů
29

To je proto,% llu nefunguje správně v systému Windows a% d nemůže zpracovat 64 bit celé číslo. Navrhuji pomocí PRIu64 místo a zjistíte, že je to přenosné na Linux stejně.

Zkuste místo toho:

#include <stdio.h>
#include <inttypes.h>

int main() {
    unsigned long long int num = 285212672; //FYI: fits in 29 bits
    int normalInt = 5;
    /* NOTE: PRIu64 is a preprocessor macro and thus should go outside the quoted string. */
    printf("My number is %d bytes wide and its value is %"PRIu64". A normal number is %d.\n", sizeof(num), num, normalInt);
    return 0;
}

Výstup

My number is 8 bytes wide and its value is 285212672. A normal number is 5.
Odpovězeno 09/09/2008 v 08:54
zdroj uživatelem

hlasů
9

V Linuxu je to %llui ve Windows je%I64u

I když jsem zjistil, že nefunguje v systému Windows 2000, se zdá, že existuje chyba!

Odpovězeno 11/09/2008 v 01:57
zdroj uživatelem

hlasů
8

Přeložit jako x64 s VS2005:

% Llu funguje dobře.

Odpovězeno 11/10/2012 v 07:23
zdroj uživatelem

hlasů
4

hex:

printf("64bit: %llp", 0xffffffffffffffff);

Výstup:

64bit: FFFFFFFFFFFFFFFF
Odpovězeno 26/07/2015 v 09:57
zdroj uživatelem

hlasů
4

Nestandardní věci jsou vždy podivné :)

Pro dlouhé dlouhé části pod GNU je to L, llneboq

a pod okny se domnívám, že je to lljen

Odpovězeno 05/08/2008 v 22:03
zdroj uživatelem

hlasů
2

Kromě toho, co lidé psali před několika lety:

  • byste mohli dostat tuto chybu v gcc / MinGW:

main.c:30:3: warning: unknown conversion type character 'l' in format [-Wformat=]

printf("%llu\n", k);

Pak se vaše verze MinGW není výchozí C99. Přidat tuto kompilátoru vlajku: -std=c99.

Odpovězeno 17/01/2016 v 12:27
zdroj uživatelem

hlasů
1

No, jeden způsob, jak je to kompilace jako x64 s VS2008

To běží jako byste očekávali:

int normalInt = 5; 
unsigned long long int num=285212672;
printf(
    "My number is %d bytes wide and its value is %ul. 
    A normal number is %d \n", 
    sizeof(num), 
    num, 
    normalInt);

Pro 32 bitový kód, musíme použít správný formát __int64 specifier% I64u. Tak to se stává.

int normalInt = 5; 
unsigned __int64 num=285212672;
printf(
    "My number is %d bytes wide and its value is %I64u. 
    A normal number is %d", 
    sizeof(num),
    num, normalInt);

Tento kód funguje pro 32 a 64 bit VS kompilátoru.

Odpovězeno 05/08/2008 v 22:40
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more