Überlauf von usigned long int? Große Zahlen verarbeiten schlägt fehl.
-
SeppJ schrieb:
zufallswert schrieb:
Andromeda schrieb:
Was wirklich schade ist und die Frage aufwirft, wieso der C-Standard so viele Freiheiten lässt.
weil Maschinen denkbar sind, die signed integers nicht im 2-Komplement kodieren.
Und es verhindert Optimierungen, wie die von mir gezeigte.
(a+b)<a
nachb < 0
optimieren zu können ist eine sehr mächtige Optimierung, weil man viel weniger Anweisungen hat. Sich das (und viele andere Optimierungen) zu verbauen wäre dumm. Aber das weißt du ja sicher mit deiner vielen PraxiserfahrungNein, weiß ich nicht. Erklär mal
-
zufallswert schrieb:
SeppJ schrieb:
zufallswert schrieb:
Andromeda schrieb:
Was wirklich schade ist und die Frage aufwirft, wieso der C-Standard so viele Freiheiten lässt.
weil Maschinen denkbar sind, die signed integers nicht im 2-Komplement kodieren.
Und es verhindert Optimierungen, wie die von mir gezeigte.
(a+b)<a
nachb < 0
optimieren zu können ist eine sehr mächtige Optimierung, weil man viel weniger Anweisungen hat. Sich das (und viele andere Optimierungen) zu verbauen wäre dumm. Aber das weißt du ja sicher mit deiner vielen PraxiserfahrungNein, weiß ich nicht. Erklär mal
Nur Vollprofis mit jahrelanger Praxiserfahrung, wie Andromeda, könnten adäquat erklären, wieso es besser ist, allgemein schnell zu sein, anstatt irgendeinem 12-Jährigen seinen schlecht programmierten Overflowtest zu lassen.
-
dachschaden schrieb:
Andromeda schrieb:
Wenn 127 überlaufen soll, betrachtest du nur die ersten 7 Bits um den Überlauf festzustellen.
Bitweise Operationen auf vorzeichenbehaftete Werte sind implementationsabhängig beziehungsweise undefiniert.
Aber das geht:
#include <stdio.h> #include <limits.h> void signed_addition_would_overflow(char a, char b) // oder underflow { printf ("Overflow? %d + %d --> ", a,b); if ((a>0 && b > CHAR_MAX-a) || (a<0 && b < CHAR_MIN-a)) puts ("Yepp!"); else puts ("Nope!"); } int main() { int a, b; for (a=-128; a<128; a++) for (b=-128; b<128; b++) signed_addition_would_overflow((char)a, (char)b); }
^^ Lässt sich leicht für int, long usw. umstricken.
-
Andromeda schrieb:
Aber das geht:
Oder du verwendest gleich die von mir verlinkten Builtins:
<signed_addition_would_overflow>: cmp dil,0x0 jle 4005e0 <signed_addition_would_overflow+0x20> movsx edi,dil mov eax,0x7f movsx esi,sil sub eax,edi cmp esi,eax setg al movzx eax,al ret xchg ax,ax mov eax,0x0 je 4005fe <signed_addition_would_overflow+0x3e> movsx edi,dil mov eax,0xffffff80 movsx esi,sil sub eax,edi cmp esi,eax setl al movzx eax,al repz ret
Vs.
<better_signed_overflow> movsx esi,sil movsx edi,dil xor eax,eax add dil,sil seto al ret nop WORD PTR cs:[rax+rax*1+0x0] nop DWORD PTR [rax+rax*1+0x0]
Oder, hey, ich habe noch 'ne viel bessere Idee: verwende einfach keine vorzeichenbehafteten Indizes. Wenn du in deinem Protokoll so weit gehen musst, negative Indizes zu benutzen, dann ist dein Protokoll absoluter Schrott und gehört wie wahrscheinlich auch deine ganze bisherige Arbeit verbrannt, in einen Glassarg verpackt und dem Ozean für alle Zeiten anvertraut.
EDIT: Satz neu formuliert, war scheiße.
-
dachschaden schrieb:
Andromeda schrieb:
Aber das geht:
Oder du verwendest gleich die von mir verlinkten Builtins:
<signed_addition_would_overflow>: cmp dil,0x0 jle 4005e0 <signed_addition_would_overflow+0x20> movsx edi,dil mov eax,0x7f movsx esi,sil sub eax,edi cmp esi,eax setg al movzx eax,al ret xchg ax,ax mov eax,0x0 je 4005fe <signed_addition_would_overflow+0x3e> movsx edi,dil mov eax,0xffffff80 movsx esi,sil sub eax,edi cmp esi,eax setl al movzx eax,al repz ret
Vs.
<better_signed_overflow> movsx esi,sil movsx edi,dil xor eax,eax add dil,sil seto al ret nop WORD PTR cs:[rax+rax*1+0x0] nop DWORD PTR [rax+rax*1+0x0]
Oder, hey, ich habe noch 'ne viel bessere Idee: verwende einfach keine vorzeichenbehafteten Indizes. Wenn du in deinem Protokoll so weit gehen musst, negative Indizes zu benutzen, dann ist dein Protokoll absoluter Schrott und gehört wie wahrscheinlich auch deine ganze bisherige Arbeit verbrannt, in einen Glassarg verpackt und dem Ozean für alle Zeiten anvertraut.
EDIT: Satz neu formuliert, war scheiße.
Junge, lass die Drogen weg.
-
Andromeda schrieb:
Junge, lass die Drogen weg.
Hör du auf, mit sinnloser Scheiße um die Ecke zu kommen. Deine Inkompetenz macht einen schlechten Eindruck auf das gesamte Forum.
-
Dazu passt sehr schön eines deiner eigenen Postings, wenn ich zitieren darf:
Weniger Geld für Schnaps, Koks und Nutten ausgeben soll angeblich Wunder bewirken.
-
Ist egal.
-
LOLAlter schrieb:
Dazu passt sehr schön eines deiner eigenen Postings, wenn ich zitieren darf:
Weniger Geld für Schnaps, Koks und Nutten ausgeben soll angeblich Wunder bewirken.
Früher war das hier ein cooles Forum. Heute benutzen es nur noch einige arrogante Schweine, um Neulingen in die Fresse zu treten.
-
Historiker schrieb:
Früher war das hier ein cooles Forum. Heute benutzen es nur noch einige arrogante Schweine, um Neulingen in die Fresse zu treten.
Verzeih mir, wenn ich dir diese Geschichte nicht abkaufe. Wenn du bereits einen solch zweifelhaften Eindruck von der Realität besitzt, dann wird es um die gespeicherte Gegenwart - also die Vergangenheit - nur noch schlechter stehen. Ich stehe nicht darauf, Neulingen in die Fresse zu treten. Ich stehe darauf, Faulpelzen in die Fresse zu treten. Aber mit Wonne und Karacho.
Ich könnte auch antworten: "Früher war alles besser!!1!", aber damit habe ich zu einfach zu oft recht.