Bitverschiebung
-
Hallo Leute,
dieses Mal beschäftige ich mich mit der Bitverschiebung. Beim Probieren ist mir aufgefallen, dass die Verschiebung gelegentlich nicht, wie von mir per Hand berechnet, eintritt.Bsp. 1 (Hier funktioniert es.)
7 dezimal => 0000 0111 binär
0000 0111 << 1 => 0000 1110 (14 dezimal)#include <stdio.h> int main() { int a; a = 7 << 1; printf("%d\n",a); return 0; }
Bsp. 2 (Hier funktioniert es nicht.)
53 dezimal => 0011 0101 binär
0011 0101 << 3 => 1010 1000 (168 dezimal)#include <stdio.h> int main() { int a; a = 53 << 3; printf("%d\n",a); return 0; }
Hier aber wird mir 424 als Ergebins ausgegeben.
-
Du hast dich ein bisschen verrechnet.
0011 0101 << 3 => 11010 1000 (424 dezimal)
Wenn du deine Zeile 4 von int a auf unsigned char a änderst kommt 168 raus, weil die 9te 1 runterfällt weil nur 8 Bits in ein char passen (x86).
-
Wie kommst Du darauf, dass ein int nur aus 8 Bit besteht?
-
Jetzt habe ich es verstanden. "Int" hat 32 Bit, weshalb bei Bsp.2 als Ergebnis 424 herauskommt.
-
Y2K schrieb:
Jetzt habe ich es verstanden. "Int" hat 32 Bit, weshalb bei Bsp.2 als Ergebnis 424 herauskommt.
nene ein int hat eine beliebige anzahl an bits idr. die bit breite eines registers der plattform also könnens auch 8 16 32 64 bit sein evtl. gibts auch noch cpus mit anderer größe also verlass dich nicht darauf dass ein int 32 bit oder sonstwas hat.
-
Ein Integer hat mindestens 16 Bit. Alles darüber kanns aber auch sein
Falls man also eine bestimmte Bitlänge braucht, sollte man stdint.h benutzen und daraus z.B. uint32_t für einen unsigned 32 Bit Wert.
-
Genmutant schrieb:
Ein Integer hat mindestens 16 Bit. Alles darüber kanns aber auch sein
hm? kann man nicht wenn man ein programm für eine 8 bit cpu macht auch int schreiben? dachte immer ein int beschreibt die am schnellsten verarbeitbare einheit einer cpu
-
Doch, auch auf einem Mikrocontroller mit 8Bit compiled dir der gcc int mit 16Bit. Es gibt allerdings einen Compiler-Switch um int mit 8Bit zu belegen. Das ist allerdings nicht Standardkonform und daher ist es möglich dass Standardfunktionen nicht mehr funktionieren, die ein int mit mindestens 16Bit erwarten.
-
es steht doch nirgends das ein int min 16 bit hat wie kommst du darauf?
-
Doch im Standard stehts :xmas1:
Im C99 Standard z.B. unter: 5.2.4.2.1 Sizes of integer types
-
oh das steht ja schon auf seite 22
danke, wieder eine unklarheit beseitigt hab mir jetzt auch mal den standard besorgt
-
da steht aber auch maximum value for an object of type int +32767
und UINT_MIN gibts schon mal garnicht...sollt ich doch mal meinen compiler schimpfen das der nicht nach standard arbeitet
-
Their implementation-defined values shall be equal or greater in magnitude (absolute value) to those shown, with the same sign.
Für signed int muss also mindestens der Bereich von -32767 bis +32767 abgedeckt sein. Mehr geht aber auch.
UINT_MIN wäre demnach 0.
-
ok ich gebe mich geschlagen
-
Genmutant schrieb:
UINT_MIN wäre demnach 0.
Da hätte man fast selber drauf kommen können
-
nwp2 schrieb:
Genmutant schrieb:
UINT_MIN wäre demnach 0.
Da hätte man fast selber drauf kommen können
also wenn dann UINT_MIN = 1
-
Jetzt sag bloß du kannst mit einem Unsigned Int keine 0 darstellen ^^
-
ach ich war gerade auf min 1bit und hab das dann so hingeschrieben, ohne weiter nach zu denken
-
Kannst du machen konkret Bitinfo für dein System(mehr oder weniger sinnfrei :D):
#include <stdio.h> #include <limits.h> // CHAR_BIT enum Type { CHAR, INT, LONG, FLOAT, DOUBLE }; int bit_info ( enum Type type ) { int nBits = -1; switch (type) { case CHAR: nBits = sizeof(char); break; case INT: nBits = sizeof(int); break; case LONG: nBits = sizeof(long); break; case FLOAT: nBits = sizeof(float); break; case DOUBLE: nBits = sizeof(double); break; default: puts("I don't know!"); } return nBits*CHAR_BIT; } int main() { printf("char: %d\n" "int: %d\n" "long: %d\n" "float: %d\n" "double: %d\n", bit_info (CHAR), bit_info (INT), bit_info (LONG), bit_info (FLOAT), bit_info (DOUBLE)); return 0; }
-
Big Brother schrieb:
(mehr oder weniger sinnfrei :D):
in der tat: *#define BITINFO(type) (sizeof(type)CHAR_BIT)