Deutsch English Français Italiano |
<v8k055$33fcl$1@dont-email.me> View for Bookmarking (what is this?) Look up another Usenet article |
Path: ...!eternal-september.org!feeder3.eternal-september.org!news.eternal-september.org!.POSTED!not-for-mail From: Thiago Adams <thiago.adams@gmail.com> Newsgroups: comp.lang.c Subject: Re: What is your opinion about unsigned int u = -2 ? Date: Fri, 2 Aug 2024 22:12:04 -0300 Organization: A noiseless patient Spider Lines: 63 Message-ID: <v8k055$33fcl$1@dont-email.me> 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> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit Injection-Date: Sat, 03 Aug 2024 03:12:05 +0200 (CEST) Injection-Info: dont-email.me; posting-host="6ca7cab00778520cac37785ddd7f8d1f"; logging-data="3259797"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX18fAhWxYt6LTZsi9mnNqGLzp16OaLjiflY=" User-Agent: Mozilla Thunderbird Cancel-Lock: sha1:t44/+AFzy8pA9zEXm548uGUH4RA= In-Reply-To: <v8jvln$33atp$1@dont-email.me> Content-Language: en-GB Bytes: 3897 Em 8/2/2024 10:03 PM, Thiago Adams escreveu: > Em 8/2/2024 4:21 PM, James Kuyper escreveu: >> On 8/2/24 14:48, Keith Thompson wrote: >>> Bart <bc@freeuk.com> writes: >>> [...] >>>> C23 assumes 2s complement. However overflow on signed integers will >>>> still be considered UB: too many compilers depend on it. >>>> >>>> But even if well-defined (eg. that UB was removed so that overflow >>>> just wraps as it does with unsigned), some here, whose initials may or >>>> may not be DB, consider such overflow Wrong and a bug in a program. >>>> >>>> However they don't consider overflow of unsigned values wrong at all, >>>> simply because C allows that behaviour. >>>> >>>> But I don't get it. If my calculation gives the wrong results because >>>> I've chosen a u32 type instead of u64, that's just as much a bug as >>>> using i32 instead of i64. >>> >>> There is a difference in that unsigned "overflow" might give >>> (consistent) results you didn't want, but signed overflow has undefined >>> behavior. >> >> When David was expressing the opinion Bart is talking about above, he >> was talking about whether it was desirable for unsigned overflow to have >> undefined behavior, not about the fact that, in C, it does have >> undefined behavior. He argued that signed overflow almost always is the >> result of a logical error, and the typical behavior when it does >> overflow, is seldom the desired way of handling those cases. Also, he >> pointed out that making it undefined behavior enables some convenient >> optimizations. >> >> For instance, the expression (num*2)/2 always has the same value as >> 'num' itself, except when the multiplication overflows. If overflow has >> undefined behavior, the cases where it does overflow can be ignored, >> permitting (num*2)/2 to be optimized to simply num. >> > > 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. > > constexpr int i = 1073741823; > constexpr int i2 = i*3/3; /*does not compile*/ > > But this compiles and outputs > > #include <stdio.h> > > int main() > { > constexpr signed char i = -2; > constexpr unsigned long long u = 0ull+i; > printf("%ull", u); /*prints 4294967294*/ > } > It is interesting to compare constexpr with the existing constant expression in C that works with integers.Compilers extend to work with unsigned long long. constexpr works with the sizes as defined , for instance char.