size_t Overflow erkennen



  • plizzz schrieb:

    Angenommen, ich habe eine int a und eine unsigned long b und berechne a + b. Eigentlich müsste das Ergebnis Typ int haben, da dabei eben auch negative Werte auftreten können.

    Der Typ ist unsigned long.
    Die Regeln nach denen das abläuft stehen z.B. hier:
    http://msdn.microsoft.com/en-us/library/09ka8bxx(v=VS.80).aspx



  • Okay danke. DAs ist gut zu wissen und ergibt Sinn.



  • Ich grade den Thread mal wieder aus. Und zwar ist es nun so, dass size_t bei mir 32 bits groß ist, ich allerdings ein 64-Bit System habe. Steht das nicht im Widerspruch zur Idee von size_t?



  • plizzz schrieb:

    Ich grade den Thread mal wieder aus. Und zwar ist es nun so, dass size_t bei mir 32 bits groß ist, ich allerdings ein 64-Bit System habe. Steht das nicht im Widerspruch zur Idee von size_t?

    Du kompilierst im 64bit Modus?



  • Darüber habe ich mir noch gar keine Gedanken gemacht - ich kompiliere einfach, sozusagen. Aber das wird dann wohl nicht der 64bit Modus sein und damit ist die Frage dann geklärt. Heißt das dann auch, dass so Dinge wie sizeof(Datentyp), CHAR_BIT, INT_MAX, ... beim Zeitpunkt der Kompilierung und nicht während der Laufzeit festgelegt werden?



  • plizzz schrieb:

    Darüber habe ich mir noch gar keine Gedanken gemacht - ich kompiliere einfach, sozusagen. Aber das wird dann wohl nicht der 64bit Modus sein und damit ist die Frage dann geklärt. Heißt das dann auch, dass so Dinge wie sizeof(Datentyp), CHAR_BIT, INT_MAX, ... beim Zeitpunkt der Kompilierung und nicht während der Laufzeit festgelegt werden?

    ja



  • Ethon schrieb:

    Wären unter 64bit immerhin 16.777.216 Terrabyte, also genug. 😉

    Das heißt Terabyte und nicht Terrabyte.



  • plizzz schrieb:

    Welchen Typ hat dann der Ausdruck 1<<n? Kann ich davon ausgehen, dass er den gleichen Typ hat wie n?

    Hier greift die arithmetic promotion, defaultmäßig rechnet C mit int.
    Nein. Deshalb verwendet man sinnigerweise auch 1UL<<n bzw. 1ULL<<n.



  • Wutz schrieb:

    Das heißt Terabyte und nicht Terrabyte.

    Dafür gibts mal ein fettes +1.



  • Wutz schrieb:

    plizzz schrieb:

    Welchen Typ hat dann der Ausdruck 1<<n? Kann ich davon ausgehen, dass er den gleichen Typ hat wie n?

    Hier greift die arithmetic promotion, defaultmäßig rechnet C mit int.
    Nein. Deshalb verwendet man sinnigerweise auch 1UL<<n bzw. 1ULL<<n.

    Vielen Dank für den Hinweis. Ich kannte die Typbestimmungen bei Literalen gar nicht.


Anmelden zum Antworten