128 Bit Datentyp
-
Was ist (in VC++2010) der Datentyp für 128 Bit unsigned?
-
Soweit ich das sehen kann geht es nur 64bit: unsigned __int64 was unsigned long long entspricht.
-
sizeof(unsigned long long)
gibt bei mir 8 aus. (8 Bytes, also 64 Bit oder wie?)Gruß
-
theliquidwave schrieb:
sizeof(unsigned long long)
gibt bei mir 8 aus. (8 Bytes, also 64 Bit oder wie?)Gruß
Ja.
-
Ich weiss nicht, wie der aktuelle Stand bei den Prozessoren ist, aber Gerüchte besagten doch vor einiger Zeit, dass kommende Intel Prozessoren mit AVX 128 Bit Integer nativ können. Dafür bräuchtest du wohl den Typ
__m128
ausxmmintrin.h
. Weiss aber nicht, ob das hilft...
-
sizeof() gibt die Größe in chars aus. Wie viel Bit das sind, ist abhängig. Daß __int64 64bit groß ist, das ist sichergestellt.
-
Sorry, ich meinte 64 Bit, nicht 128.
-
Fellhuhn schrieb:
Daß __int64 64bit groß ist, das ist sichergestellt.
komisch den kenn ich garnicht
-
fdfg schrieb:
Sorry, ich meinte 64 Bit, nicht 128.
Okay. Dann
unsigned __int64
oder wie ich es mach mit boostcstdint.h
.
-
no_c0de schrieb:
Fellhuhn schrieb:
Daß __int64 64bit groß ist, das ist sichergestellt.
komisch den kenn ich garnicht
Vc++ Datentyp
Warum implementieren 64bit Compiler keine 128bit Integer? Für 32bit Compiler gabs doch auch 64bit Integertypen, für die man 2 Register zusammenkleben musste...
-
Genau das will ich. Ich habe ein Programm zum Rechnen mit großen Zahlen geschrieben, das mit 32-Bit-Werten operiert und bei Zwischenrechnungen 64 Bit benötigt.
Jetzt will ich das für ein 64-Bit-System auf (64,128) erhöhen.
-
Icematix schrieb:
Warum implementieren 64bit Compiler keine 128bit Integer? Für 32bit Compiler gabs doch auch 64bit Integertypen, für die man 2 Register zusammenkleben musste...
Mangelnder Bedarf?
Wer braucht schon Rechnungen die auf 38 statt 19 Stellen genau sind? Entweder braucht man etwas viel größeres oder man ist mit 64 Bit locker bedient. Es ist sehr sehr selten, dass man tatsächlich etwas zwischen 64 und 128 Bit braucht.
Das Beispiel des Threaderstellers ist ein schönes Gegenbeispiel wo Genauigkeit nur um ihrer selbst willen gebraucht wird.
-
... und da reichen Klassen wie BigInt oder wie sie immer heißen mögen locker aus.
-
fdgfdg schrieb:
Was ist (in VC++2010) der Datentyp für 128 Bit unsigned?
#include <emmintrin.h> __m128i x;
Viel Spaß damit
-
Danke, aber da bekomme ich folgende Fehler:
main.cpp main.cpp(12): error C2440: 'initializing' : cannot convert from 'int' to '__m128i' No constructor could take the source type, or constructor overload resolution was ambiguous main.cpp(15): error C2679: binary '<<' : no operator found which takes a right-hand operand of type '__m128i' (or there is no acceptable conversion) C:\Program Files\Microsoft Visual Studio 10.0\VC\include\ostream(679): could be 'std::basic_ostream<_Elem,_Traits> &std::operator <<<char,std::char_traits<char>>(std::basic_ostream<_Elem,_Traits> &,const char *)' with [ _Elem=char, _Traits=std::char_traits<char> ] C:\Program Files\Microsoft Visual Studio 10.0\VC\include\ostream(726): or 'std::basic_ostream<_Elem,_Traits> &std::operator <<<char,std::char_traits<char>>(std::basic_ostream<_Elem,_Traits> &,char)' with [ _Elem=char, _Traits=std::char_traits<char> ] C:\Program Files\Microsoft Visual Studio 10.0\VC\include\ostream(764): or 'std::basic_ostream<_Elem,_Traits> &std::operator <<<std::char_traits<char>>(std::basic_ostream<_Elem,_Traits> &,const char *)' with [ _Elem=char, _Traits=std::char_traits<char> ] C:\Program Files\Microsoft Visual Studio 10.0\VC\include\ostream(811): or 'std::basic_ostream<_Elem,_Traits> &std::operator <<<std::char_traits<char>>(std::basic_ostream<_Elem,_Traits> &,char)' with [ _Elem=char, _Traits=std::char_traits<char> ] C:\Program Files\Microsoft Visual Studio 10.0\VC\include\ostream(937): or 'std::basic_ostream<_Elem,_Traits> &std::operator <<<std::char_traits<char>>(std::basic_ostream<_Elem,_Traits> &,const signed char *)' with [ _Elem=char, _Traits=std::char_traits<char> ] C:\Program Files\Microsoft Visual Studio 10.0\VC\include\ostream(944): or 'std::basic_ostream<_Elem,_Traits> &std::operator <<<std::char_traits<char>>(std::basic_ostream<_Elem,_Traits> &,signed char)' with [ _Elem=char, _Traits=std::char_traits<char> ] C:\Program Files\Microsoft Visual Studio 10.0\VC\include\ostream(951): or 'std::basic_ostream<_Elem,_Traits> &std::operator <<<std::char_traits<char>>(std::basic_ostream<_Elem,_Traits> &,const unsigned char *)' with [ _Elem=char, _Traits=std::char_traits<char> ] C:\Program Files\Microsoft Visual Studio 10.0\VC\include\ostream(958): or 'std::basic_ostream<_Elem,_Traits> &std::operator <<<std::char_traits<char>>(std::basic_ostream<_Elem,_Traits> &,unsigned char)' with [ _Elem=char, _Traits=std::char_traits<char> ] C:\Program Files\Microsoft Visual Studio 10.0\VC\include\ostream(968): or 'std::basic_ostream<_Elem,_Traits> &std::operator <<<char,std::char_traits<char>,__m128i>(std::basic_ostream<_Elem,_Traits> &&,_Ty)' with [ _Elem=char, _Traits=std::char_traits<char>, _Ty=__m128i ] C:\Program Files\Microsoft Visual Studio 10.0\VC\include\ostream(1085): or 'std::basic_ostream<_Elem,_Traits> &std::operator <<<char,std::char_traits<char>>(std::basic_ostream<_Elem,_Traits> &,const std::error_code &)' with [ _Elem=char, _Traits=std::char_traits<char> ] C:\Program Files\Microsoft Visual Studio 10.0\VC\include\ostream(186): or 'std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(std::basic_ostream<_Elem,_Traits> &(__cdecl *)(std::basic_ostream<_Elem,_Traits> &))' with [ _Elem=char, _Traits=std::char_traits<char> ] C:\Program Files\Microsoft Visual Studio 10.0\VC\include\ostream(192): or 'std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(std::basic_ios<_Elem,_Traits> &(__cdecl *)(std::basic_ios<_Elem,_Traits> &))' with [ _Elem=char, _Traits=std::char_traits<char> ] C:\Program Files\Microsoft Visual Studio 10.0\VC\include\ostream(199): or 'std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(std::ios_base &(__cdecl *)(std::ios_base &))' with [ _Elem=char, _Traits=std::char_traits<char> ] C:\Program Files\Microsoft Visual Studio 10.0\VC\include\ostream(206): or 'std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(std::_Bool)' with [ _Elem=char, _Traits=std::char_traits<char> ] C:\Program Files\Microsoft Visual Studio 10.0\VC\include\ostream(226): or 'std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(short)' with [ _Elem=char, _Traits=std::char_traits<char> ] C:\Program Files\Microsoft Visual Studio 10.0\VC\include\ostream(260): or 'std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(unsigned short)' with [ _Elem=char, _Traits=std::char_traits<char> ] C:\Program Files\Microsoft Visual Studio 10.0\VC\include\ostream(280): or 'std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(int)' with [ _Elem=char, _Traits=std::char_traits<char> ] C:\Program Files\Microsoft Visual Studio 10.0\VC\include\ostream(305): or 'std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(unsigned int)' with [ _Elem=char, _Traits=std::char_traits<char> ] C:\Program Files\Microsoft Visual Studio 10.0\VC\include\ostream(325): or 'std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(long)' with [ _Elem=char, _Traits=std::char_traits<char> ] C:\Program Files\Microsoft Visual Studio 10.0\VC\include\ostream(345): or 'std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(unsigned long)' with [ _Elem=char, _Traits=std::char_traits<char> ] C:\Program Files\Microsoft Visual Studio 10.0\VC\include\ostream(366): or 'std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(__int64)' with [ _Elem=char, _Traits=std::char_traits<char> ] C:\Program Files\Microsoft Visual Studio 10.0\VC\include\ostream(386): or 'std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(unsigned __int64)' with [ _Elem=char, _Traits=std::char_traits<char> ] C:\Program Files\Microsoft Visual Studio 10.0\VC\include\ostream(407): or 'std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(float)' with [ _Elem=char, _Traits=std::char_traits<char> ] C:\Program Files\Microsoft Visual Studio 10.0\VC\include\ostream(427): or 'std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(double)' with [ _Elem=char, _Traits=std::char_traits<char> ] C:\Program Files\Microsoft Visual Studio 10.0\VC\include\ostream(447): or 'std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(long double)' with [ _Elem=char, _Traits=std::char_traits<char> ] C:\Program Files\Microsoft Visual Studio 10.0\VC\include\ostream(467): or 'std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(const void *)' with [ _Elem=char, _Traits=std::char_traits<char> ] C:\Program Files\Microsoft Visual Studio 10.0\VC\include\ostream(487): or 'std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(std::basic_streambuf<_Elem,_Traits> *)' with [ _Elem=char, _Traits=std::char_traits<char> ] while trying to match the argument list '(std::ostream, __m128i)' main.cpp(16): error C2676: binary '<<=' : '__m128i' does not define this operator or a conversion to a type acceptable to the predefined operator
#include <iostream> #include <emmintrin.h> using namespace std; int main() { //_int128 i = 1 << 64; //cout << i << endl; //unsigned long i = 1 << 63; //cout << i; __m128i x = 1; for (int i = 0; i < 128; ++i) { cout << x << endl; x <<= 1; } char c; cin >> c; if (c == 'a') cout << "richtig"; else cout << "falsch"; }
-
Scheint so, als würde sich
__m128i
nicht besonders gut in C++ integrieren. Erkundige dich doch auf MSDN...Oder erspare dir die ganze Mühe und benutze eine portable Bibliothek für grosse Zahlen.
-
__m128i ist nur für das Arbeiten mit SSE2-Intrinsics gedacht, das integriert sich also in der Tat sehr schlecht in C++.
Habe das hier gefunden:
http://stackoverflow.com/questions/1188939/representing-128-bit-numbers-in-cWie weit bei der Klasse noch Optimierungspotential besteht, weiß ich nicht.
An einer stark optimierten (u)int128-Klasse hätte ich auch Interesse. Nicht, dass ich es wirklich brauche, wäre aber nett.Nexus schrieb:
Oder erspare dir die ganze Mühe und benutze eine portable Bibliothek für grosse Zahlen.
Es hinterlässt aber schon einen üblen Nachgeschmack, wenn man sein Projekt um eine Abhängigkeit vom Kaliber GMP erweitert, nur weil man mit 128 Bit-Zahlen rechnen wollte. Dafür hat man natürlich dann auch erweiterte Funktionalität wie pow/sqrt, die bei der oben genannten Klasse nicht dabei ist.
-
Athar schrieb:
Habe das hier gefunden:
http://stackoverflow.com/questions/1188939/representing-128-bit-numbers-in-cWie weit bei der Klasse noch Optimierungspotential besteht, weiß ich nicht.
An einer stark optimierten (u)int128-Klasse hätte ich auch Interesse. Nicht, dass ich es wirklich brauche, wäre aber nett.Danke, ich schaus mir mal an und optimiere es ggf.
-
Athar schrieb:
Es hinterlässt aber schon einen üblen Nachgeschmack, wenn man sein Projekt um eine Abhängigkeit vom Kaliber GMP erweitert, nur weil man mit 128 Bit-Zahlen rechnen wollte.
Konnte, nicht wollte.
Ich kenne mich mit entsprechenden Bibliotheken zwar nicht aus, kann mir aber gut vorstellen, dass es darunter auch leichtgewichtige gibt (z.B. für feste Grössen wie 128 Bit).