Grenzen für int-Zahlen
-
Erstmal: vielen dank für die rasanten Antworten.
Arcoth schrieb:
unsigned int ui {};
Bitte diesen Unsinn unterlassen.
= 0
hätte es auch getan und wäre noch Zig mal schneller gelesen worden.Gut, danke für den Hinweiß, war aber nur aus dem Buch abgeschrieben :p
SeppJ schrieb:
Bei den unsigned Varianten wird ein Bitshift um 1 nach Rechts vorgenommen und von Rechts mit Nullen aufgefüllt.
Von links wird aufgefüllt, da ja nach rechts geschoben wird, aber das ist sicher auch das, was du meinst.
Ups, war wohl ein Kaffee zu viel :p Jap, meinte von links.
Gut, dann scheint mein Verständnis für Angelegenheit ja schon mal ganz ok gewesen zu sein.
Danke für die Hilfe. Echt super!Schönen Abend noch, wünsch ich.
-
Swordfish schrieb:
icarus2 schrieb:
Swordfish schrieb:
icarus2 schrieb:
[...] (ein
int
ist in C++ mindestens 16 Bits gross [...]Wo steht das?
Im C++ Stanadard, Seite 21 und 22.
Das kanns Wertemäßig nicht sein, denn das würde heißen, daß laut
UINT_MAX
einunsigned
genau 16 Bit breit sein muss ...Ein
unsigned
muss mindestens 16 Bits breit sein. Eine konkrete Implementierung darf auch mehr Bits verwenden (steht auf Seite 21 unter 5.2.4.2.1 Sizes f integer types <limits.h>)
-
Ah, ich hab' "equal or greater in magnitude" überlesen.
-
SeppJ schrieb:
Kevintosh schrieb:
Das heißt, dass das Bit was zur Darstellung des Vorzeichens benötigt wird 0 ist und somit nicht zur Darstellung der Zahl beiträgt. Die restlich-verbleibenden Bits sind alle 1 und man erhält die maximal darstellbare Zahl bei der Beachtung von Vorzeichen.
Ja. Wobei man hier quasi ein bisschen Glück hat, dass in allen üblichen und unüblichen Repräsentationen von vorzeichenbehafteten Zahlen die größte Zahl stets die Bitrepräsentation 011…11 hat.
Ist denn im Standard definiert, dass beim Rechtsshift eine 0 eingeschoben wird (logical shift).
Oder kann auch das Vorzeichen kopiert werden (arithmetic shift)
-
Bei unsigned Typen muss eine 0 reingeschoben werden, bei signed Typen ist implementation defined(?) welches von beiden passiert.
-
bei signed Typen ist implementation defined(?) welches von beiden passiert.
Ja, wenn sie negativ sind:
The value of is right-shifted bit positions. If has an unsigned type or if has a signed type and a non-negative value, the value of the result is the integral part of the quotient of .
If has a signed type and a negative value, the resulting value is implementation-defined.
-
Ein elegante Lösung für ein uraltes Problem
Habe das ganze mal nachgestellt und auf short und long long erweitert. Komischerweise liefert mir die Ausgabe für unsigned short und short jeweils -1 als Maximalwert. Verwendeter Compiler: VS2013 Pro, Aufruf cl /EHsc its.cpp// its.cpp - Integer types maximum numbers // displays the maximum numbers for integer types #include <iostream> using std::cout; using std::endl; int main() { unsigned short us = 0; unsigned int ui = 0; unsigned long ul = 0; unsigned long long ull = 0; cout << "max unsigned short = " << ~us << endl; cout << "max signed short = " << (~us>>1) << endl; cout << "max unsigned int = " << ~ui << endl; cout << "max signed int = " << (~ui>>1) << endl; cout << "max unsigned long = " << ~ul << endl; cout << "max signed long = " << (~ul>>1) << endl; cout << "max unsigned llong = " << ~ull << endl; cout << "max signed llong = " << (~ull>>1) << endl; }
Ausgabe:
max unsigned short = -1 max signed short = -1 max unsigned int = 4294967295 max signed int = 2147483647 max unsigned long = 4294967295 max signed long = 2147483647 max unsigned llong = 18446744073709551615 max signed llong = 9223372036854775807
Wie ist das zu erklären? Danke für die Hilfe im vorraus
-
Weil es für die Negation automatisch zum nächsthöheren Typ aufgewertet wird, also int. Das ist signed und erhält deshalb ein Minus. Bei char das gleiche. Du musst es also casten: (unsigned short)(~us)
Stichwort: integer promotion
-
§13.6/10 schrieb:
For every promoted integral type T, there exist candidate operator functions of the form
T operator∼(T );unsigned short
gehört nicht zu den promoted integral types. Daher wird deinunsigned short
erstmal nachint
konvertiert. Der Rest ist selbsterklärend.Edit: Zu spät :p
-
oenone schrieb:
Stichwort: integer promotion
Macht Sinn, mit nem Cast hats jetzt geklappt.
Danke für die schnelle Hilfe!