2011-11-21 9 views
21

Sto usando g ++ versione 4.1.2 su una casella RHEL 5.7 x86_64. Questo si integra perfettamente con g ++ versione 4.4.5 che viene fornito con RHEL 6.0 x86_64. Che cosa significa questo errore del compilatore e come lo risolvi?errore: suffisso non valido "b1111111111111111111111111111111111" sulla costante intera

[[email protected] C]$ g++ -Wall -o binary ./binary.cpp 
./binary.cpp:2:5: error: invalid suffix "b11111111111111111111111111111111" on integer constant 
./binary.cpp:3:5: error: invalid suffix "b11111111111111111111111111111110" on integer constant 
./binary.cpp:4:5: error: invalid suffix "b11111111111111111111111111111100" on integer constant 
./binary.cpp:5:5: error: invalid suffix "b11111111111111111111111111111000" on integer constant 
./binary.cpp:6:5: error: invalid suffix "b11111111111111111111111111110000" on integer constant 
./binary.cpp:7:5: error: invalid suffix "b11111111111111111111111111100000" on integer constant 
./binary.cpp:8:5: error: invalid suffix "b11111111111111111111111111000000" on integer constant 
./binary.cpp:9:5: error: invalid suffix "b11111111111111111111111110000000" on integer constant 
./binary.cpp:10:5: error: invalid suffix "b11111111111111111111111100000000" on integer constant 
./binary.cpp:11:5: error: invalid suffix "b11111111111111111111111000000000" on integer constant 
./binary.cpp:12:5: error: invalid suffix "b11111111111111111111110000000000" on integer constant 
./binary.cpp:13:5: error: invalid suffix "b11111111111111111111100000000000" on integer constant 
./binary.cpp:14:5: error: invalid suffix "b11111111111111111111000000000000" on integer constant 
./binary.cpp:15:5: error: invalid suffix "b11111111111111111110000000000000" on integer constant 
./binary.cpp:16:5: error: invalid suffix "b11111111111111111100000000000000" on integer constant 
./binary.cpp:17:5: error: invalid suffix "b11111111111111111000000000000000" on integer constant 
./binary.cpp:18:5: error: invalid suffix "b11111111111111110000000000000000" on integer constant 
./binary.cpp:19:5: error: invalid suffix "b11111111111111100000000000000000" on integer constant 
./binary.cpp:20:5: error: invalid suffix "b11111111111111000000000000000000" on integer constant 
./binary.cpp:21:5: error: invalid suffix "b11111111111110000000000000000000" on integer constant 
./binary.cpp:22:5: error: invalid suffix "b11111111111100000000000000000000" on integer constant 
./binary.cpp:23:5: error: invalid suffix "b11111111111000000000000000000000" on integer constant 
./binary.cpp:24:5: error: invalid suffix "b11111111110000000000000000000000" on integer constant 
./binary.cpp:25:5: error: invalid suffix "b11111111100000000000000000000000" on integer constant 
./binary.cpp:26:5: error: invalid suffix "b11111111000000000000000000000000" on integer constant 
./binary.cpp:27:5: error: invalid suffix "b11111110000000000000000000000000" on integer constant 
./binary.cpp:28:5: error: invalid suffix "b11111100000000000000000000000000" on integer constant 
./binary.cpp:29:5: error: invalid suffix "b11111000000000000000000000000000" on integer constant 
./binary.cpp:30:5: error: invalid suffix "b11110000000000000000000000000000" on integer constant 
./binary.cpp:31:5: error: invalid suffix "b11100000000000000000000000000000" on integer constant 
./binary.cpp:32:5: error: invalid suffix "b11000000000000000000000000000000" on integer constant 
./binary.cpp:33:5: error: invalid suffix "b10000000000000000000000000000000" on integer constant 

Il codice:

static int s_bitCountMask[32] = { 
    0b11111111111111111111111111111111, 
    0b11111111111111111111111111111110, 
    0b11111111111111111111111111111100, 
    0b11111111111111111111111111111000, 
    0b11111111111111111111111111110000, 
    0b11111111111111111111111111100000, 
    0b11111111111111111111111111000000, 
    0b11111111111111111111111110000000, 
    0b11111111111111111111111100000000, 
    0b11111111111111111111111000000000, 
    0b11111111111111111111110000000000, 
    0b11111111111111111111100000000000, 
    0b11111111111111111111000000000000, 
    0b11111111111111111110000000000000, 
    0b11111111111111111100000000000000, 
    0b11111111111111111000000000000000, 
    0b11111111111111110000000000000000, 
    0b11111111111111100000000000000000, 
    0b11111111111111000000000000000000, 
    0b11111111111110000000000000000000, 
    0b11111111111100000000000000000000, 
    0b11111111111000000000000000000000, 
    0b11111111110000000000000000000000, 
    0b11111111100000000000000000000000, 
    0b11111111000000000000000000000000, 
    0b11111110000000000000000000000000, 
    0b11111100000000000000000000000000, 
    0b11111000000000000000000000000000, 
    0b11110000000000000000000000000000, 
    0b11100000000000000000000000000000, 
    0b11000000000000000000000000000000, 
    0b10000000000000000000000000000000, 
}; 

#include <stdio.h> 

int main(int argc, char *argv[]) 
{ 
    for (int i = 0; i < 32; i++) { 
     printf("%d\n",s_bitCountMask[i]); 
    } 
} 
+29

+1 perché l'errore è semplicemente fantastico. – slhck

+3

Come posso non fare clic su un titolo del genere? – Mysticial

+3

Non una risposta, ma non sarebbe più facile calcolare l'array in fase di runtime? –

risposta

29

Significa il più vecchio verison di g ++ non accetterà il 0b000 binario sintassi delle costanti. È possibile riscrivere i numeri come esadecimale invece - binario si traduce facilmente in esadecimale quattro bit alla volta:

0xffffffff, 0xfffffffe, 0xfffffffc, 0xfffffff8, 
0xfffffff0, 0xffffffe0, 0xffffffc0, 0xffffff80, 
0xffffff00, 0xfffffe00, 0xfffffc00, 0xfffff800, 
0xfffff000, 0xffffe000, 0xffffc000, 0xffff8000, 
0xffff0000, 0xfffe0000, 0xfffc0000, 0xfff80000, 
0xfff00000, 0xffe00000, 0xffc00000, 0xff800000, 
0xff000000, 0xfe000000, 0xfc000000, 0xf8000000, 
0xf0000000, 0xe0000000, 0xc0000000, 0x80000000 
+6

BTW, il formato binario è disponibile solo a partire da [gcc 4.3] (http://gcc.gnu.org/gcc-4.3/changes.html). – kennytm

8

Rup ha la risposta corretta a questa. Ma io aggiungo questo:

A seconda di come si sta accedendo quel tavolo, potrebbe essere più appropriato per generare solo il valore sul posto con questo:

unsigned mask = ~((1 << index) - 1); 
unsigned mask = -1 << index;   // Better solution (by Rup) 

In alternativa, si potrebbe anche dichiarare la tabella come questa:

static int s_bitCountMask[32] = { 
    -1 << 0, 
    -1 << 1, 
    -1 << 2, 
    -1 << 3, 

    ... 

    -1 << 31, 
}; 

* Supponendo che -1 è tutto un bit (che è su quasi ogni macchina ora).

+0

:-) Lo avrei modificato se fossi riuscito a pensarci in tempo. Il mio tentativo sarebbe stato '-1 << indice' o' (~ 0) << indice'. – Rup

+2

Dovresti renderlo non firmato. –

+0

Ah, anch'io l'ho trascurato. Aggiornato la mia risposta. – Mysticial

Problemi correlati