2010-04-16 6 views

Antwort

18

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

+0

Ich möchte wissen, ob sizeof (int)! = 4 wie man eine 4 Bytes int mir.thanks – kkpattern

+0

Vielen Dank, und auch danke allen Jungs – kkpattern

+0

@ 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

0

Versuchen Sie, die INT_MAX Konstante in limits.h

+0

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

+0

Also? Sie sind untrennbar miteinander verbunden. Ein 4-Byte-Wert kann nur 2^32 Werte enthalten. – Fred

+0

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

0

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.

+0

ja Ich möchte es zu 4 Bytes benötigen, weil ich es in eine Socket-Nachricht einfügen muss. – kkpattern

0

sizeof (int) wird die Anzahl der Bytes zurückgeben, die ein int im Speicher des aktuellen Systems belegt.

8

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.

+0

bitfields ist erstaunlich! :) danke Sie – kkpattern

+0

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

+0

@Arkku Bitfields ist so subtil.Vielen Dank für Sie – kkpattern

0

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

0

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.

0

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 
Verwandte Themen