Deutsch English Français Italiano |
<878qxefjk2.fsf@nosuchdomain.example.com> View for Bookmarking (what is this?) Look up another Usenet article |
Path: ...!feeds.phibee-telecom.net!3.eu.feeder.erje.net!feeder.erje.net!eternal-september.org!feeder3.eternal-september.org!news.eternal-september.org!.POSTED!not-for-mail From: Keith Thompson <Keith.S.Thompson+u@gmail.com> Newsgroups: comp.lang.c Subject: Re: What is your opinion about unsigned int u = -2 ? Date: Fri, 02 Aug 2024 19:04:45 -0700 Organization: None to speak of Lines: 67 Message-ID: <878qxefjk2.fsf@nosuchdomain.example.com> References: <v8dfo9$1k7cg$1@dont-email.me> <pan$d2c8a$8c54ac9f$29a202e0$12c6ce86@invalid.invalid> <87bk2cecan.fsf@bsb.me.uk> <v8inds$2qpqh$1@dont-email.me> <v8iqnr$7l3c$1@news.xmission.com> <v8irje$2rolg$1@dont-email.me> <87r0b6g3qx.fsf@nosuchdomain.example.com> <v8jbj5$2us0r$4@dont-email.me> <v8jvln$33atp$1@dont-email.me> <87h6c2fldh.fsf@nosuchdomain.example.com> <v8k21v$33nca$1@dont-email.me> MIME-Version: 1.0 Content-Type: text/plain Injection-Date: Sat, 03 Aug 2024 04:04:45 +0200 (CEST) Injection-Info: dont-email.me; posting-host="01c35e2bca840e4e4b0a2795d8f6c72e"; logging-data="3248403"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX1+/zC0r1usZtR5FzxgHh/Bf" User-Agent: Gnus/5.13 (Gnus v5.13) Cancel-Lock: sha1:dCnhqYfggN6h9cbFQml/NPu+Gws= sha1:k+eqeICZKtxrl2yhsgMOOoJq+Ok= Bytes: 3753 Thiago Adams <thiago.adams@gmail.com> writes: > Em 8/2/2024 10:25 PM, Keith Thompson escreveu: >> Thiago Adams <thiago.adams@gmail.com> writes: >> [...] >>> I am doing experiments with constexpr. What happens with overflow in >>> compile time? The answer is not so clear. Sometimes it does not >>> compile and sometimes it works as in runtime. >> Your first example fails due to signed integer overflow. Your >> second >> example is well defined because there is no such thing as unsigned >> integer overflow. > > I need a new name other than overflow. Wraparound, or unsigned wraparound if you want to be a little more precise. C23 adds this entry to the glossary (3.28): wraparound the process by which a value is reduced modulo 2^N, where N is the width of the resulting type The standard uses a superscript, which I can't easily reproduce here. I hope it's sufficiently obvious that I'm not using ^ to mean bitwise xor. N3220 6.2.5p11 (same or similar wording appears in earlier editions) : A computation involving unsigned operands can never produce an overflow, because arithmetic for the unsigned type is performed modulo 2^N. > The expression > > ULLONG_MAX*ULLONG_MAX/ULLONG_MAX/ULLONG_MAX > > has the result 1 if calculated with infinite precision. > > But the calculated value here is 0 Right. The subexpression ULLONG_MAX*ULLONG_MAX in infinite precision would be 340282366920938463426481119284349108225 in infinite precision, but assuming 64-bit unsigned long long the actual result is that value modulo 2^64, or 1. Dividing 1 by ULLONG_MAX yields 0 (since integer division truncates); dividing again by ULLONG_MAX yields 0 again. The reduction modulo 2^64 happens on each arithmitic operation (here one multiplication and two divisions), not on the expression as a whole. Since ULLONG_MAX*ULLONG_MAX is 1 (more precisely 1ull), the expression ULLONG_MAX*ULLONG_MAX/ULLONG_MAX/ULLONG_MAX is equivalent to 1ull/ULLONG_MAX/ULLONG_MAX > #include <stdio.h> > > int main() > { > constexpr unsigned long long ULLONG_MAX = 18446744073709551615; > constexpr unsigned long long r = > ULLONG_MAX*ULLONG_MAX/ULLONG_MAX/ULLONG_MAX; > printf("%llu", r); > } -- Keith Thompson (The_Other_Keith) Keith.S.Thompson+u@gmail.com void Void(void) { Void(); } /* The recursive call of the void */