Hvordan printf en usignert lang lang int (formatet spesifiserendes for usignerte lang lang int)?

stemmer
296
#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;
}

Produksjon:

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

Jeg antar at dette uventede resultatet er fra å skrive ut unsigned long long int. Hvordan gjør du printf()en unsigned long long int?

Publisert på 05/08/2008 klokken 20:59
kilden bruker
På andre språk...                            


11 svar

stemmer
392

Bruk ll (el-el) lang lang modifikator med den u (unsigned) omdannelse. (Fungerer i Windows, GNU).

printf("%llu", 285212672);
Svarte 05/08/2008 kl. 21:02
kilden bruker

stemmer
73

Det kan være lurt å prøve å bruke inttypes.h bibliotek som gir deg typer som int32_t, int64_t, uint64_tetc. Du kan deretter bruke sine makroer som:

uint64_t x;
uint32_t y;

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

Dette er "garantert" å ikke gi deg samme problemer som long, unsigned long longetc, siden du ikke trenger å gjette hvor mange biter er i hver datatype.

Svarte 12/08/2008 kl. 11:07
kilden bruker

stemmer
35

For lenge lenge (eller __int64) med MSVS, bør du bruke% I64d:

__int64 a;
time_t b;
...
fprintf(outFile,"%I64d,%I64d\n",a,b);    //I is capital i
Svarte 06/09/2009 kl. 14:26
kilden bruker

stemmer
34

%d-> for int

%u-> for unsigned int

%ld-> for long int

%lu-> for unsigned long int

%lld-> for long long int

%llu-> for unsigned long long int

Svarte 13/05/2015 kl. 17:48
kilden bruker

stemmer
30

Det er fordi% LLUB ikke fungerer under Windows og% d kan ikke håndtere 64 bits heltall. Jeg foreslår at du bruker PRIu64 stedet, og du vil finne det er bærbar til Linux også.

Prøv dette i stedet:

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

Produksjon

My number is 8 bytes wide and its value is 285212672. A normal number is 5.
Svarte 09/09/2008 kl. 07:54
kilden bruker

stemmer
10

I Linux er det %lluog i Windows er det%I64u

Selv om jeg har funnet det fungerer ikke i Windows 2000, synes det å være en feil der!

Svarte 11/09/2008 kl. 00:57
kilden bruker

stemmer
8

Sette den som x64 med VS2005:

% LLUB fungerer godt.

Svarte 11/10/2012 kl. 06:23
kilden bruker

stemmer
4

hex:

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

Produksjon:

64bit: FFFFFFFFFFFFFFFF
Svarte 26/07/2015 kl. 09:57
kilden bruker

stemmer
4

Non-standard ting er alltid rart :)

for lang lang del under GNU den er L, llellerq

og under vinduer jeg tror det er llbare

Svarte 05/08/2008 kl. 21:03
kilden bruker

stemmer
2

I tillegg til hva folk skrev år siden:

  • du kan få denne feilen på gcc / MinGW:

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

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

Så din versjon av MinGW ikke standard til C99. Legg denne kompilatoren flagg: -std=c99.

Svarte 17/01/2016 kl. 12:27
kilden bruker

stemmer
1

Vel, er en måte å kompilere den som x64 med VS2008

Dette går som forventet:

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);

For 32 bits kode, må vi bruke riktig __int64 format Specifier% I64u. Så det blir.

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);

Denne koden fungerer for både 32 og 64 bit VS kompilatoren.

Svarte 05/08/2008 kl. 21:40
kilden bruker

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