Ich möchte wissen, wie int zu melden, um sicherzustellen, dass es 4 Bytes oder kurz in 2 Bytes egal auf welcher Plattform ist. Hat C99 diesbezüglich Regeln?So stellen Sie sicher ein Int ist 4 Bytes oder 2 Bytes in C/C++
Antwort
C99 sagt nicht viel darüber, aber Sie können überprüfen, ob sizeof(int) == 4
, oder Sie können feste Größe Typen wie uint32_t (32 Bits unsigned Integer) verwenden. Sie sind definiert in stdint.h
Ich möchte wissen, ob sizeof (int)! = 4 wie man eine 4 Bytes int mir.thanks – kkpattern
Vielen Dank, und auch danke allen Jungs – kkpattern
@ kkpattern, stellen Sie sicher, die Antwort "durch Klicken auf die grau gefärbten" -Out-Kontrollkästchen neben dieser Antwort. Es wird dann grün und du bekommst einen zusätzlichen 2 Wiederholer :) – Earlz
Versuchen Sie, die INT_MAX
Konstante in limits.h
Nein, ich glaube nicht, dass er nach dem maximal möglichen Wert eines int sucht, er sucht nach einer Möglichkeit, die Anzahl der von einem int verwendeten Bytes sicherzustellen. – FrustratedWithFormsDesigner
Also? Sie sind untrennbar miteinander verbunden. Ein 4-Byte-Wert kann nur 2^32 Werte enthalten. – Fred
Zwei Seiten der gleichen Münze, keine Notwendigkeit, darauf zu nitpick, da der höchste Wert und die Anzahl der Bytes zur Darstellung der Zahl so eng verwandt sind. – Fred
Haben Sie es erforderlich sein sollen 4 Byte sein?
Wenn Sie nur die Größe von int sehen möchten, wie es auf jeder Plattform kompiliert wird, dann können Sie einfach sizeof(int)
tun.
ja Ich möchte es zu 4 Bytes benötigen, weil ich es in eine Socket-Nachricht einfügen muss. – kkpattern
sizeof (int)
wird die Anzahl der Bytes zurückgeben, die ein int
im Speicher des aktuellen Systems belegt.
Wenn Sie C99 verwenden und Integer-Typen einer bestimmten Größe benötigen, geben Sie stdint.h
ein. Es definiert Typen wie uint32_t
für eine vorzeichenlose ganze Zahl von genau 32 Bits und uint_fast32_t
für eine vorzeichenlose ganze Zahl von mindestens 32 Bits und "fast" auf der Zielmaschine durch eine Definition von schnell.
Edit: Denken Sie daran, dass Sie auch Bitfelder verwenden, um eine bestimmte Anzahl von Bits zu bekommen (auch wenn es nicht die beste Leistung geben kann, vor allem mit „fremden“ Größen und die meisten Aspekte sind die Implementierung definiert):
typedef struct {
unsigned four_bytes:32;
unsigned two_bytes:16;
unsigned three_bits:3;
unsigned five_bits:5;
} my_message_t;
Edit 2: Denken Sie auch daran, dass sizeof
die Nummer char
s zurückgibt. Es ist theoretisch möglich (obwohl in diesen Tagen sehr unwahrscheinlich), dass char
nicht 8 Bits ist; die Anzahl der Bits in einem char
ist definiert als CHAR_BIT
in limits.h
.
bitfields ist erstaunlich! :) danke Sie – kkpattern
Beachten Sie, dass die genaue Darstellung von Bitfeldern implementationsabhängig ist und dazu führen kann, dass der Compiler unerwartet viel zusätzlichen Code generiert, z um "seltsame" Feldgrößen wie 3 Bits zu behandeln. Und Sie können keine Zeiger auf Bitfeld-Mitglieder usw. haben. Es ist besser, die 'stdint.h'-Typen zu verwenden, wenn Sie dort geeignete finden. Aber Bitfelder können nützlich sein, wenn Sie Daten packen müssen, um die Hardwareanforderungen oder ähnliches zu erfüllen. – Arkku
@Arkku Bitfields ist so subtil.Vielen Dank für Sie – kkpattern
Ich nehme an, Sie wollen etwas über die offensichtliche sizeof (int) == 4
Überprüfung hinaus. Wahrscheinlich möchten Sie eine Kompilierzeitüberprüfung.
In C++ können Sie BOOST_STATIC_ASSERT
verwenden.
In C können Sie Zusicherungen für die Kompilierungszeit erstellen, indem Sie Code schreiben, der versucht, bei einem Fehler Arrays mit negativer Größe zu erstellen, oder versucht, switch
Anweisungen mit neu definierten Fällen zu erstellen. Sehen Sie sich diese Stapelüberlauffrage für Beispiele an: Ways to ASSERT expressions at build time in C
Sie können sizeof (int) verwenden, aber Sie können niemals annehmen, wie groß ein int ist. Die C-Spezifikation legt keine Annahmen über die Größe eines int fest, außer dass sie größer oder gleich der Größe eines short sein muss (der größer oder gleich der Größe eines char sein muss).
Oft ist die Größe eines int an der zugrunde liegenden Hardware ausgerichtet. Dies bedeutet, dass ein int typischerweise das gleiche wie ein Wort ist, wobei ein Wort die funktionale Größe von Daten ist, die vom Speicherbus abgerufen werden (oder manchmal die CPU-Registerbreite). Es muss nicht dasselbe wie ein Wort sein, aber die frühesten Notizen, die ich angegeben habe, sollten die bevorzugte Größe für die Speicherübertragung sein (was typischerweise ein Wort ist).
In der Vergangenheit gab es 18 Bit Inte (PDP-8) und 24 Bit Inte (PDP-15). Es gab Architekturen mit 36 Bit Wortgrößen (PDP-11), aber ich kann mich nicht erinnern, was ihre int-Größe war.
Auf Linux-Plattformen können Sie in
für jeden Typ#include <sys/types.h>
bekommen die tatsächliche Bitzahl spähen.
Ich fand letzte Nacht, dass Visual Studio 2008 C99 nicht gut unterstützt, und es stdint.h nicht unterstützt. ABER sie haben ihre eigenen Typen. hier ist ein Beispiel:
#ifdef _MSC_VER
typedef __int8 int8_t;
typedef unsigned __int8 uint8_t;
typedef __int16 int16_t;
typedef unsigned __int16 uint16_t;
typedef __int32 int32_t;
typedef unsigned __int32 uint32_t;
typedef __int64 int64_t;
typedef unsigned __int64 uint64_t;
#else
#include <stdint.h>
#endif
- 1. Konvertieren von 2 Bytes in vorzeichenbehafteten int
- 2. Wie kann man diese einfachen 5 Bytes wieder in 4 Bytes umwandeln? (Algorithmus 4 Bytes in 5 Bytes zu konvertieren bekannt ist)
- 3. konvertieren Sie eine Zeichenfolge von Bytes in ein int (Python)
- 4. 16-Bit-Vorzeichen int in 2 Bytes umwandeln?
- 5. warum Referenzgröße ist immer 4 Bytes - C++
- 6. Warum ist ein boolescher 4 Bytes in .NET?
- 7. Umwandlung von 4 Socket-Bytes in einen int
- 8. Kombinieren von 2 Bytes
- 9. sizeof (2147483648) ist 8 Bytes während sizeof (2147483647 + 1) 4 Bytes ist
- 10. So stellen Sie sicher, dass eine Variable ein Objekt ist
- 11. Konvertierung von Bytes zu int in Java
- 12. Convert 3 aufeinanderfolgende Bytes zu zwei int
- 13. 28 zusätzliche Bytes in BSS
- 14. 2 Bytes zu kurz Java
- 15. Malloc von 2 Bytes gibt Probleme
- 16. Convert 2 Bytes in eine ganze Zahl
- 17. Warum ist Typ (Bytes())
- 18. Enum Größe in Bytes
- 19. Python Scrapy: TypeError: to_bytes muss ein Unicode-, str- oder bytes-Objekt erhalten, int int
- 20. So lesen Sie Bytes als Stream in Python 3
- 21. Bedeutet Java-Xmx1G 10^9 oder 2^30 Bytes?
- 22. Wie produziere ich 8 Bytes aus 4 Bytes mit einer reproduzierbaren Operation?
- 23. C# Big-Endian ulong von 4 Bytes
- 24. Bitweise Operatoren und konvertieren ein int zu 2 Bytes und wieder zurück
- 25. Bytes in verschiedenen Kodierungen
- 26. httpclient 4 wie bekomme ich Bytes
- 27. Kürzeste Möglichkeit, diese Bytes in Python in int zu konvertieren?
- 28. Lesen Sie mehrere Bytes, springen Sie über N Bytes und lesen Sie dann mehrere Bytes erneut. Wie?
- 29. Stellen Sie sicher, dass ein Subprozess in Cocoa ungültig ist
- 30. Konvertieren von Bytes zu Int/uint in C
@Pavel, die wirklich in der FAQ sollte – Earlz
@Pavel Ihnen danken, ich bin so glücklich, dass ich Stackoverflow im Internet zu finden. – kkpattern