Nasıl bir imzasız uzun uzun İnt (işaretsiz uzun uzun int için biçim belirteci) printf mı?

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

Çıktı:

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

Bu beklenmedik sonuç yazdırmasını olduğunu varsayalım unsigned long long int. Size nasıl printf()bir unsigned long long int?

Oluştur 05/08/2008 saat 21:59
kaynak kullanıcı
Diğer dillerde...                            


12 cevaplar

oy
380

U (işaretsiz) dönüşüm ile ll (El-E,), uzun süren değiştirici kullanın. (GNU, pencerelerde Works).

printf("%llu", 285212672);
Cevap 05/08/2008 saat 22:02
kaynak kullanıcı

oy
71

Sen seni gibi türleri verir inttypes.h kitaplığını kullanarak deneyebilirsiniz int32_t, int64_t, uint64_tvb Ardından gibi onun makroları kullanabilirsiniz:

uint64_t x;
uint32_t y;

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

Bu, aynı sorun çıkarmayacak kadar "garantili" olduğunu long, unsigned long longher veri türü kaç bit tahmin gerekmez çünkü, vb.

Cevap 12/08/2008 saat 12:07
kaynak kullanıcı

oy
34

Uzun uzun (veya __int64) MSVS kullanmak için,% I64d kullanmalısınız:

__int64 a;
time_t b;
...
fprintf(outFile,"%I64d,%I64d\n",a,b);    //I is capital i
Cevap 06/09/2009 saat 15:26
kaynak kullanıcı

oy
30

%d-> için int

%u-> için unsigned int

%ld-> için long int

%lu-> için unsigned long int

%lld-> için long long int

%llu-> için unsigned long long int

Cevap 13/05/2015 saat 17:48
kaynak kullanıcı

oy
29

% Llu Windows altında düzgün çalışmıyor ve% d 64 bitlik tamsayılar işleyemez olmasıdır. Bunun yerine PRIu64 kullanmanızı öneririz ve bunu yanı Linux taşınabilir bulacaksınız.

Bunun yerine bu deneyin:

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

Çıktı

My number is 8 bytes wide and its value is 285212672. A normal number is 5.
Cevap 09/09/2008 saat 08:54
kaynak kullanıcı

oy
9

Linux'ta öyle %lluve Windows öyle%I64u

Ben 2000'de çalışmıyor bulduk rağmen, orada bir hata var gibi görünüyor!

Cevap 11/09/2008 saat 01:57
kaynak kullanıcı

oy
8

VS2005 ile x64 olarak derleme:

% Llu iyi çalışıyor.

Cevap 11/10/2012 saat 07:23
kaynak kullanıcı

oy
4

hex:

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

Çıktı:

64bit: FFFFFFFFFFFFFFFF
Cevap 26/07/2015 saat 09:57
kaynak kullanıcı

oy
4

Standart dışı şeyler her zaman garip :)

GNU altında uzun uzun bölümü için bu kadar L, llya daq

ve pencere altında ben inanıyorum llsadece

Cevap 05/08/2008 saat 22:03
kaynak kullanıcı

oy
2

insanlar yıllar önce yazdıklarını ek olarak:

  • Eğer gcc / MinGW bu hatayı alabilirsiniz:

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

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

Sonra MinGW sürümünüz c99 varsayılan değildir. Bu derleyici bayrağı ekleyin: -std=c99.

Cevap 17/01/2016 saat 12:27
kaynak kullanıcı

oy
1

Eh, tek yönlü VS2008 ile x64 olarak derlemek etmektir

beklediğiniz gibi bu çalıştırır:

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

32 bitlik kod için, doğru __int64 biçim belirteci% I64u kullanmak gerekir. Yani olur.

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

Bu kod derleyici VS hem 32 ve 64 bit için çalışır.

Cevap 05/08/2008 saat 22:40
kaynak kullanıcı

oy
0

Anlaşılan kimse bir çok platformda ile geldi * çözümü bir on yıl içinde 2008 yılı, bu yüzden 😛 mayın eklemek zorundadır [bir] beri. Upvote Plz. (Şaka. Umrumda değil.)

Çözüm: lltoa()

Nasıl kullanılır:

#include <stdlib.h> /* lltoa() */
// ...
char dummy[255];
printf("Over 4 bytes: %s\n", lltoa(5555555555, dummy, 10));
printf("Another one: %s\n", lltoa(15555555555, dummy, 10));

OP'ın örnek:

#include <stdio.h>
#include <stdlib.h> /* lltoa() */

int main() {
    unsigned long long int num = 285212672; // fits in 29 bits
    char dummy[255];
    int normalInt = 5;
    printf("My number is %d bytes wide and its value is %s. "
        "A normal number is %d.\n", 
        sizeof(num), lltoa(num, dummy, 10), normalInt);
    return 0;
}

Aksine %lldbaskı biçim dizesi, bu bir benim için çalışıyor Windows üzerinde 32 bit GCC altında.

*) Eh, neredeyse çoklu platformu. MSVC olarak, görünüşe göre ihtiyaç _ui64toa()yerine lltoa().

Cevap 22/03/2019 saat 22:08
kaynak kullanıcı

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