2017-03-28 9 views
2
#include <stdio.h> 
#include <stdint.h> 

int main(){ 
    uint64_t a = 1 << 63; 
    /* do some thing */ 
    return 0; 
} 

$ gcc -Wall -Wextra -std=c99 test.c -o test 
warning: left shift count >= width of type [-Wshift-count-overflow] 

Q: uint64_t sollte 64 Bits Breite, warum die linke Shift-Operation überläuft?wie man verwendet uint64_t in C

+0

1 ist ein 'int' Literal. Mit '1ULL << 63' statt –

+0

@ LưuVĩnhPhúc C wird '1' als _integer constant_ vom Typ 'int' angegeben. Die einzigen _literals_ in C sind _string literals_ und _compound literals_. "1" ist keiner dieser 2 Literale. – chux

+0

"Warum läuft die linke Schicht?" -> Was zuerst passiert: '1 << 63' oder seine Zuordnung zu' uint64_t a'? Da "1 << 63" zuerst auftritt, ist der Typ, dem er zugeordnet ist, für die Bewertung "1 << 63" irrelevant. – chux

Antwort

6

1 ist eine int, die entweder nur 32 Bit auf Ihrer Plattform ist, oder es könnte 64 Bit sein, aber signiert.

Verwenden Sie (uint64_t)1 << 63, um 1 in 64-Bit-Ganzzahl ohne Vorzeichen zu konvertieren. (Oder ((uint64_t)1) << 63, wenn Sie bevorzugen)

+0

keine Notwendigkeit zu werfen, '1ULL' sieht besser aus. Und '(uint64_t) 1 << 64 'ruft undefiniertes Verhalten auf, weil Sie mehr als die Bitlänge des Werts verschoben haben –

+0

@ LưuVĩnhPhúc Fixed, 64 sollte 63 sein. – immibis

Verwandte Themen