2011-09-13 11 views
5

ho alimentato il seguente codice tramite uno strumento di analisi statica:Le parentesi in C possono modificare il tipo di risultato degli operandi di un'operazione bit a bit?

u1 = (u1^u2); // OK 

u1 = (u1^u2) & u3; // NOT OK 

u1 = (u1^u2) & 10; // NOT OK 

u1 = (u1^u2) & 10U; // NOT OK 

u1 = (unsigned char)(u1^u2) & 10U; // OK 

u1 = (unsigned char)(u1^u2) & u3; // OK 

"OK" si intende lo strumento di analisi statica non si lamentava. "NOT OK" significa che lo strumento di analisi statica ha reclamato - affermando che alcuni operandi di un'operazione bit a bit non sono un numero intero senza segno.

I risultati degli ultimi 2 righe mostrano che le parentesi causano o

a. una conversione di tipo reale a firmata

b. qualcosa che lo strumento di analisi statica pensa sia una conversione di tipo a firmata

Chiederò allo sviluppatore di strumenti di analisi statica riguardo (b).

Ma prima di farlo, mi piacerebbe sapere se forse il linguaggio C è noto per fare (a)?

risposta

6

Niente in C viene fatto sotto int: ad esempio quando si aggiungono due unsigned chars, anche prima della aggiunta, gli operandi vengono convertiti in int secondo promozioni predefinite.

unsigned char u1, u2, u3; 
u1 = 0; 
u2 = 42; 
u3 = u1 + u2; 

Nell'ultima linea, prima u1 e u2 vengono convertiti int, allora l'operatore + viene applicato per ottenere un valore int e quindi tale valore viene riconvertito unsigned char (naturalmente il compilatore può utilizzare collegamenti!)

+0

Grazie a @ pmg! Lascerò la parola "parentesi" nel titolo della domanda perché, anche se ora so che sono irrilevanti, altri potrebbero pensare che siano ciò che sta causando il problema, cercare e trovare questa risposta. Ora capisco che questa buona risposta è un caso speciale di "imparare le regole di promozione dell'intero C". Un sacco di riferimenti là fuori (ora che so cosa cercare). Per esempio. http://tinyurl.com/62fm8yl su stackoverflow e href = "http://www.lysator.liu.se/c/rat/c2.html#3-2" - una discussione su "preservazione e valore non firmati preservare". – talkaboutquality

3

Questo perché, in C, il tipo risultante di un'operazione su due unsigned char: s è int. Lo strumento di analisi statica correttamente (sebbene non molto intuitivo) segnala che lo & viene applicato a un int.