Domanda

Sto inizializzando un int corto senza segno con a = 0xff (tutti i bit sono impostati). Quindi assegno b a a & Gt; & Gt; 7 che dovrebbe dare (0000 0001) e lo fa. Tuttavia, la cosa strana è che quando assegno c a un & Lt; & Lt; 7, non è equivalente a (1000 0000). Ho provato questo producendo 0x80 (che è 1000 0000) ec, ma non sono gli stessi.

Ecco un po 'di codice:

unsigned short int a = 0xff;
unsigned short int b = a>>7;
unsigned short int c = a<<7; // c should == 0x80

Non sono sicuro di quale sia il problema. Qualsiasi aiuto è apprezzato. Grazie.

P.S. Per & Quot; output & Quot; Intendo output 0x80 ec in forma decimale ed esadecimale.

È stato utile?

Soluzione

un int breve ha 16, non solo 8 bit.

Quindi probabilmente otterrai " 0111 1111 1000 0000 " come risultato di 0xff < < 7.

Altri suggerimenti

Non indovinare per i tipi di bit, usa <stdint.h>


Una breve int " di solito " ha 16 bit. In realtà, sono abbastanza sicuro che sempre ne abbia 16 ad eccezione di quei computer marziani, ma non è qualcosa che lo standard promette.

Se si desidera dichiarare tipi con un numero specifico di bit, la tecnica conforme è:

#include <stdint.h>

  int8_t  a;
 uint8_t  b;
 int16_t  x;
uint16_t  y;

In questo modo avresti evitato la tua ipotesi non del tutto corretta sulla rappresentazione bit di short. Per qualche ragione, Microsoft è molto lontana dalla conformità allo standard C99, anche su cose semplici come <=>. Fortunatamente, un progetto mantiene una versione standard VC ++ .

Mi aspetto che tu abbia 0x7f80. Penso che intendevi scrivere:

unsigned short int c = b<<7; // c should == 0x80

Sfortunatamente, VC ++ (il compilatore C) non ha inttypes.h perché non supporta completamente C99. Devi usare intestazioni di terze parti (ad es. Stdint.h di Paul Hsieh).

Se vuoi ottenere quel risultato, puoi tagliare la porzione a << 7 maggiore dell'ottavo-meno-significativo-bit, usando bit-bit e:

unsigned short int c = (a << 7) & 0xff;
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top