2015-07-21 13 views
7

Próbuję wydrukować zmienną typu int64_t przy użyciu specyfikatora formatu %lld, ale otrzymam następujące ostrzeżenie?format '% lld' oczekuje typu 'long long int', ale argument 4 ma typ 'int64_t'

Ostrzeżenie: format '% LLD' oczekuje typu 'long long int', ale argumentem 4 ma typ 'int64_t'

Moim zdaniem, pod Linuksem int64_t jest zawsze long long int, a następnie :

  1. Dlaczego pojawia się to ostrzeżenie?
  2. Jak mogę to naprawić?
+5

* Moim zdaniem, pod linuxem, 'int64_t' jest zawsze' long long int'. * W rzeczywistości nie ma gwarancji, że * zawsze * będzie w tym przypadku. –

+3

Co więcej, ponieważ kompilator narzekał na format 'printf', najprawdopodobniej nie jest' long long' na twojej platformie, ale 'long'. –

+3

Nie programuj według opinii, uprzedzeń, przesądów, przekonań lub osób, którym powiedzieli mi o mnie. Zamiast tego: 1) dowiedzieć się, gdzie są zasady, 2) poznać zasady, 3) przestrzegać zasad. –

Odpowiedz

17

jak to naprawić?

Zastosowanie PRId64: (Nie zapomnij podać <inttypes.h>)

printf("var64 = %" PRId64 "\n", var64); 

Korzystając PRIx64 i właściwej obsady jeśli chcesz wydrukować go jako hex.

int64_t jest zawsze long long int, to dlaczego pojawia się to ostrzeżenie?

C99 r (link to draft, strona 22), specyfikacje C wskazują typ long long int należy conajmniej 64 bitów, lecz może być również więcej.

- minimalna wartość dla obiektu typu dłuższy długi int
LLONG_MIN -9223372036854775807 // - (2 1)
- maksymalna wartość dla obiektu typu Dawno Int
LLONG_MAX +9223372036854775807// - 1

na niektórych platformach, long long int może być 128-bit oraz oświadczenie print wywołuje UB na takich platformach.

Traktuj to ostrzeżenie jako ostrzeżenie o przenośności.

+1

Należy zauważyć, że na 64-bitowym Linux 'long long int' ma 64 bity; jednak 'int64_t' jest nadal' długim int', a nie 'długim długim int', więc gcc ostrzega o używaniu specyfikatora formatu'% lld', ponieważ nie pasuje on do typu (nawet jeśli mają one tę samą podstawową reprezentację). –

Powiązane problemy