Warnung: Anzahl der linken Verschiebungen >= Schriftbreite

Lesezeit: 2 Minuten

Benutzeravatar von Rupert Madden-Abbott
Rupert Madden-Abbott

Ich bin sehr neu im Umgang mit Bits und bin beim Kompilieren an der folgenden Warnung hängen geblieben:

 7: warning: left shift count >= width of type

Meine Linie 7 sieht so aus

unsigned long int x = 1 << 32;

Dies wäre sinnvoll, wenn die Größe von long auf meinem System war 32 Bit. Jedoch, sizeof(long) kehrt zurück 8 und CHAR_BIT ist definiert als 8 was darauf hindeutet, dass long 8×8 = 64 Bits lang sein sollte.

Was fehlt mir hier? Gibt sizeof und CHAR_BIT falsch oder habe ich was grundlegendes falsch verstanden?

Benutzeravatar von James McNellis
James McNellis

long kann ein 64-Bit-Typ sein, aber 1 ist immer noch ein int. Sie müssen machen 1 a long int Verwendung der L Suffix:

unsigned long x = 1UL << 32;

(Sie sollten es auch schaffen unsigned Verwendung der U Suffix, wie ich gezeigt habe, um die Probleme der Linksverschiebung einer vorzeichenbehafteten Ganzzahl zu vermeiden. Es gibt kein Problem, wenn a long ist 64 Bit breit und Sie verschieben um 32 Bit, aber es wäre ein Problem, wenn Sie 63 Bit verschieben würden)

  • Möchten unsigned long x = 1; x <<= 32; Arbeit, aus Interesse?

    – Niet the Dark Absol

    17. November 2010 um 3:53 Uhr

  • @Kolink: Ja, das hätte den gleichen Effekt, wie würde (unsigned long)1 << 32 Der linke Operand muss nur ein sein unsigned long. Das UL Suffix ist nur der einfachste Weg, dies zu erreichen.

    – James McNellis

    17. November 2010 um 4:03 Uhr


  • @James McNellis: Was ist das Ausgaben von links Verschieben einer vorzeichenbehafteten Ganzzahl? Ich weiß nur das Rechts Das Verschieben einer vorzeichenbehafteten Ganzzahl kann bei verschiedenen Compilern zu unterschiedlichen Ergebnissen führen.

    – pynexj

    18. März 2013 um 5:34 Uhr

  • @whjm: Es kann überlaufen. Der Überlauf einer vorzeichenbehafteten Ganzzahl ist ein undefiniertes Verhalten.

    – Siyuan Ren

    10. März 2014 um 9:46 Uhr

  • @whjm: Ich habe gerade auf den C99-Standard verwiesen und Folgendes gefunden: Das Ergebnis von E1 << E2 sind E1 nach links verschobene E2 Bitpositionen; frei gewordene Bits werden mit Nullen aufgefüllt. Wenn E1 einen vorzeichenlosen Typ hatist der Wert des Ergebnisses E1 × 2 ** E2, reduziert Modulo eins mehr als der im Ergebnistyp darstellbare Maximalwert. Wenn E1 einen vorzeichenbehafteten Typ und einen nichtnegativen Wert hat und E1 × 2 ** ist, ist E2 im Ergebnistyp darstellbardann ist das der resultierende Wert; andernfalls ist das Verhalten undefiniert.

    – pynexj

    17. März 2014 um 5:33 Uhr


Benutzeravatar von tznza
tzza

unsigned long ist 32 Bit oder 64 Bit, was von Ihrem System abhängt. unsigned long long ist immer 64bit. Sie sollten es wie folgt tun:

unsigned long long x = 1ULL << 32

  • IOW, es ist die Größe der Konstante 1, die Ihnen Probleme bereitet, nicht x.

    – deStrangis

    2. Oktober 2012 um 15:49 Uhr

Die akzeptierte Lösung ist in Ordnung für [constant]ULL<<32 aber nicht gut für existierende Variablen - zB [variable]<<32. Die vollständige Lösung für Variablen lautet: ((unsigned long long)[variable]<<32). Randbemerkung: Meine persönliche Meinung zu dieser Warnung ist, dass sie von vornherein völlig unnötig ist. Der Compiler kann sehen, was der empfangende Datentyp ist und kennt die Breite der Parameter aus den Definitionen in Headern oder konstanten Werten. Ich glaube, Apple könnte den Clang-Compiler in Bezug auf diese Warnung etwas intelligenter machen, als er es ist.

unsigned long x = 1UL << 31;

Fehlermeldung nicht anzeigen. Denn bevor du die 32 vorgibst, stimmt das nicht, weil nur auf 0-31 begrenzt.

Benutzeravatar von vipul bagga
vipul bagga

Sie können einen Wert nicht auf sein maximales Bit verschieben

int x;         // let int be 4 bytes so max bits : 32 
x <<= 32; 

Dies erzeugt also die Warnung

left shift count >= width of type (i.e type = int = 32 )

  • Deine Formulierung ist falsch. Du kann Verschiebung a 1 zum signifikantesten Bit seiner Art, wenn es so ist unsigned oder wenn es ist signed und hat INT_MIN == 1 << width - 1. Es verschiebt sich Darüber hinaus das höchste Bit, das Probleme verursachen kann.

    – Unterstrich_d

    30. Oktober 2017 um 23:54 Uhr

  • @underscore_d nein, Sie können es nicht versuchen (auf einem unsignierten Typ). int main(){ unsigned int x = 1 << 32; unsigned int y = 32; unsigned int z = 1 << y; printf("x:%d, z: %d\n", x, z); }

    – Evan Caroll

    18. September 2018 um 21:27 Uhr


  • @EvanCarroll Ich denke, wir streiten uns nur alle darüber, was “to its max bit” bedeutet, dh ob “to” “by” bedeutet und / oder “max” “am signifikantesten” bedeutet … Ich habe in Begriffen gesprochen des Verschiebens zu das am bedeutendsten bisschen, was in Ordnung ist. Was du und Vipul gesagt haben, 1 << 32 dh 1 << sizeof(T) * CHAR_BITscheißt die 1 ein bisschen darüber hinauswas eine andere Sache ist.

    – Unterstrich_d

    18. September 2018 um 21:32 Uhr


  • Ich habe den Tippfehler von “Byte” korrigiert. Und du verstehst es immer noch nicht! Indizierung von Bits ab 1 an der niederwertigsten Stelle: 1 ist das 1. niederwertigste Bit eines 32-Bit-Typs (was übrigens unsigned int Es ist nicht nötig). Um dies zum höchstwertigen Bit, dh dem 32. Bit, zu verschieben, verschieben wir um nach links 31, also sind wir dann bei 1 + 31 = das 32., höchstwertige Bit. Ich habe mit der Formulierung gehadert und gesagt, dass ich dies tun würde, 1 << 31 in einem 32-Bit-Typ ist in Ordnung. Ich sage nicht zu tun 1 << 32

    – Unterstrich_d

    18. September 2018 um 21:37 Uhr


Benutzeravatar von Mateusz Piotrowski
Mateusz Piotrowski

Sie können so etwas verwenden:

unsigned long x = 1;
x = x << 32;

  • Deine Formulierung ist falsch. Du kann Verschiebung a 1 zum signifikantesten Bit seiner Art, wenn es so ist unsigned oder wenn es ist signed und hat INT_MIN == 1 << width - 1. Es verschiebt sich Darüber hinaus das höchste Bit, das Probleme verursachen kann.

    – Unterstrich_d

    30. Oktober 2017 um 23:54 Uhr

  • @underscore_d nein, Sie können es nicht versuchen (auf einem unsignierten Typ). int main(){ unsigned int x = 1 << 32; unsigned int y = 32; unsigned int z = 1 << y; printf("x:%d, z: %d\n", x, z); }

    – Evan Caroll

    18. September 2018 um 21:27 Uhr


  • @EvanCarroll Ich denke, wir streiten uns nur alle darüber, was “to its max bit” bedeutet, dh ob “to” “by” bedeutet und / oder “max” “am signifikantesten” bedeutet … Ich habe in Begriffen gesprochen des Verschiebens zu das am bedeutendsten bisschen, was in Ordnung ist. Was du und Vipul gesagt haben, 1 << 32 dh 1 << sizeof(T) * CHAR_BITscheißt die 1 ein bisschen darüber hinauswas eine andere Sache ist.

    – Unterstrich_d

    18. September 2018 um 21:32 Uhr


  • Ich habe den Tippfehler von “Byte” korrigiert. Und du verstehst es immer noch nicht! Indizierung von Bits ab 1 an der niederwertigsten Stelle: 1 ist das 1. niederwertigste Bit eines 32-Bit-Typs (was übrigens unsigned int Es ist nicht nötig). Um dies zum höchstwertigen Bit, dh dem 32. Bit, zu verschieben, verschieben wir um nach links 31, also sind wir dann bei 1 + 31 = das 32., höchstwertige Bit. Ich habe mit der Formulierung gehadert und gesagt, dass ich dies tun würde, 1 << 31 in einem 32-Bit-Typ ist in Ordnung. Ich sage nicht zu tun 1 << 32

    – Unterstrich_d

    18. September 2018 um 21:37 Uhr


1415750cookie-checkWarnung: Anzahl der linken Verschiebungen >= Schriftbreite

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy