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?
Antwort
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.
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.
Uint16_t hat immer noch Endian-Probleme. –
@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
Ja. Ich würde dich nicht dafür abschwören. Aber ich dachte, es wäre erwähnenswert. –
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.
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.
Was ist die Verbindung mit der Frage? –
@ 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. –
- 1. Entspricht eine Zeichenfolgenlänge der Bytegröße?
- 2. Warum ist die Bytegröße einer Zeichenfolge länger als die Länge?
- 3. Benutzerdefinierte Steuerung Benutzerdefinierte Methoden?
- 4. Benutzerdefinierte benutzerdefinierte Leerfeld-Fehlermeldung
- 5. Benutzerdefinierte vs. nicht benutzerdefinierte Attribute?
- 6. AngularJS benutzerdefinierte Richtlinie isoliert Umfang benutzerdefinierte Felder
- 7. Benutzerdefinierte Daten für benutzerdefinierte Ereignisse in HockeyApp
- 8. FMDB SQLite Wrapper und benutzerdefinierte/benutzerdefinierte Funktionen
- 9. Joomla benutzerdefinierte Typen/benutzerdefinierte Felder ohne Plugin?
- 10. Laravel Validation - benutzerdefinierte Regel, benutzerdefinierte Fehlermeldung
- 11. Benutzerdefinierte String-Literale Vs. Andere Benutzerdefinierte Literale
- 12. Benutzerdefinierte Stile für benutzerdefinierte Widgets in Qt
- 13. Benutzerdefinierte Abfrage für Wordpress benutzerdefinierte Beitragstyp
- 14. Spring Security benutzerdefinierte UserDetailsService und benutzerdefinierte Benutzerklasse
- 15. Spark Build Benutzerdefinierte Spaltenfunktion, benutzerdefinierte Funktion
- 16. Aurelia: Benutzerdefinierte Elemente vs Benutzerdefinierte Attribute
- 17. C# Benutzerdefinierte CheckBox + Benutzerdefinierte Bindung Datentyp
- 18. CSS für benutzerdefinierte Checkbox und benutzerdefinierte Radiobox
- 19. Benutzerdefinierte Camelization
- 20. Benutzerdefinierte Ereignisbehandlung
- 21. benutzerdefinierte Benachrichtigung
- 22. benutzerdefinierte postgresql
- 23. UISearchBar benutzerdefinierte
- 24. Benutzerdefinierte Befehlserstellung
- 25. Benutzerdefinierte Tastaturkürzel
- 26. Benutzerdefinierte Webfonts
- 27. Benutzerdefinierte DependencyProperty
- 28. Benutzerdefinierte Gerüstvorlagen
- 29. Benutzerdefinierte Klassenkonstanten
- 30. Benutzerdefinierte MessageBox
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
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
@Laserallan Ich möchte dies für Mathe mit Primitiven in C++ verwenden, die Zahlen aus dem Bereich der Standard-Primitiven in C++ gehen. –