2010-04-21 9 views
6

Also wissen Sie, wie das Primitiv vom Typ char die Größe von 1 Byte hat? Wie würde ich ein primitives mit einer benutzerdefinierten Größe machen? So wie anstelle von einem int mit der Größe von 4 Bytes mache ich einen mit der Größe von sagen wir 16. Gibt es eine Möglichkeit, dies zu tun? Gibt es einen Weg dahin?Benutzerdefinierte Bytegröße?

+1

Was möchten Sie damit erreichen? Ist es möglich, größere Zahlen in Ihren Berechnungen zuzulassen, oder haben Sie andere Pläne für Ihre 16 Byte großen Ganzzahlen? – Laserallan

+1

Dies ist eine interessante Frage, aber ein wenig unterspezifiziert. Und die Antworten befassen sich nicht mit der Erstellung von größeren oder kleineren Primitiven. Kleiner als ein 'char': überschreiben' operator & 'wie in' std :: vector :: iterator'. Größer als ein 'long int': Verwenden Sie eine Bignum-Bibliothek. – Potatoswatter

+0

@Laserallan Ich möchte dies für Mathe mit Primitiven in C++ verwenden, die Zahlen aus dem Bereich der Standard-Primitiven in C++ gehen. –

Antwort

5

Normalerweise würden Sie nur eine Struktur erstellen, die die Daten darstellt, an denen Sie interessiert sind. Wenn es sich um 16 Byte Daten handelt, handelt es sich entweder um eine Zusammenfassung einer Anzahl kleinerer Typen, oder Sie arbeiten an einem Prozessor mit einem nativen integrierten 16-Byte-Typ.

Wenn Sie versuchen, extrem große Zahlen darzustellen, müssen Sie möglicherweise eine spezielle Bibliothek finden, die beliebig große Zahlen verarbeiten kann.

4

Es hängt davon ab, warum Sie dies tun. Normalerweise können Sie keine Typen mit weniger als 8 Bit verwenden, da dies die adressierbare Einheit für die Architektur ist. Sie können structs verwenden, jedoch auf unterschiedliche Längen zu definieren:

struct s { 
    unsigned int a : 4; // a is 4 bits 
    unsigned int b : 4; // b is 4 bits 
    unsigned int c : 16; // c is 16 bits 
}; 

Es besteht jedoch keine Garantie, dass die Struktur 24 Bit lang sein wird. Dies kann auch Endian-Probleme verursachen. Wo immer Sie können, verwenden Sie am besten systemunabhängige Typen wie uint16_t usw. Sie können auch bitweise Operatoren und Bit-Verschiebungen verwenden, um die Dinge ganz gezielt zu verändern.

+0

Uint16_t hat immer noch Endian-Probleme. –

+0

@Billy wahr ... Ich denke, mein Punkt ist, dass Bitfelder in Strukturen in dieser Hinsicht sehr unordentlich sind, und das ist einer ihrer primären Verwendungen. – WhirlWind

+0

Ja. Ich würde dich nicht dafür abschwören. Aber ich dachte, es wäre erwähnenswert. –

0

Wenn Sie einen neuen Typ erstellen möchten, geben Sie ihn ein. Wenn Sie möchten, dass es eine Größe von 16 Byte hat, geben Sie dedef eine Struktur ein, die 16 Byte Mitgliedsdaten enthält. Seien Sie jedoch vorsichtig, dass Compiler oft Dinge auf Sie aufpassen, die Ihren Anforderungen an die Systemausrichtung entsprechen. Eine 1-Byte-Struktur bleibt selten 1 Byte ohne Sorgfalt.

1

In C++ 11 gibt es dafür eine ausgezeichnete Lösung: std :: aligned_storage.

#include <memory> 
#include <type_traits> 

int main() 
{ 
    typedef typename std::aligned_storage<sizeof(int)>::type memory_type; 
    memory_type i; 
    reinterpret_cast<int&>(i) = 5; 
    std::cout << reinterpret_cast<int&>(i) << std::endl; 

    return 0; 
} 

Es ermöglicht Ihnen, einen Block nicht initialisierten Speichers auf dem Stapel zu deklarieren.

+0

Was ist die Verbindung mit der Frage? –

+0

@ J.N. Abgesehen von der offensichtlichen Tatsache, dass es Ihnen erlaubt, Speicher in benutzerdefinierter Größe auf dem Stapel oder Heap zuzuweisen, können Sie dann benutzerdefinierte Klassen einer bestimmten Seite mit den richtigen Methoden definieren. Es verhält sich vielleicht nicht wie ein primitives Element, aber wenn Sie eine Klasse mit einer benutzerdefinierten Größe benötigen, ist dies ein großartiges Werkzeug, das Sie verwenden können (sogar wie eine Ganzzahl mit benutzerdefinierter Breite). Es ist viel besser als eine benutzerdefinierte strict mit beliebigen Datenelementen zu definieren. –

Verwandte Themen