Path: ...!3.eu.feeder.erje.net!feeder.erje.net!eternal-september.org!feeder3.eternal-september.org!news.eternal-september.org!.POSTED!not-for-mail From: Thiago Adams Newsgroups: comp.lang.c Subject: Re: how cast works? Date: Sun, 11 Aug 2024 09:23:19 -0300 Organization: A noiseless patient Spider Lines: 67 Message-ID: References: <87ttfu94yv.fsf@nosuchdomain.example.com> <87zfpj537h.fsf@nosuchdomain.example.com> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit Injection-Date: Sun, 11 Aug 2024 14:23:20 +0200 (CEST) Injection-Info: dont-email.me; posting-host="5178e0c40238d6cd6e3cb7269b7f3c31"; logging-data="2400959"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX1/zdiko4C8xuLLHGnXDNy5XOeDY4/RrxSI=" User-Agent: Mozilla Thunderbird Cancel-Lock: sha1:3BDdSEMu0ArkyqolB3AjnlZ6RWc= Content-Language: en-GB In-Reply-To: <87zfpj537h.fsf@nosuchdomain.example.com> Bytes: 3360 Em 8/10/2024 9:10 PM, Keith Thompson escreveu: > Thiago Adams writes: >> Em 8/10/2024 1:14 PM, Bart escreveu: >>>> >>>> Bart, Does your compiler support the `bool` type, where the value >>>> is always either 1 or 0? >>> There is a bool type, but it is treated like unsigned char, so is >>> non-conforming. >> >> I do the same in my compiler , when I transpile from C99 to C89. >> I was thinking how to make it conforming. >> For instance on each write. >> >> bool b = 123; -> unsigned char b = !!(123); >> >> The problem this does not fix unions, writing on int and reading from char. > > I don't think you need to fix that. [....] > Summary: > > Conversion from any scalar type to _Bool is well defined, and must yield > 0 or 1. I will fix in terns of expressions types. - In this case cast to bool - Assignment to bool > It's possible to force a representation other than 0 or 1 into a _Bool > object, bypassing any value conversion. > > Conversion from _Bool to any scalar type is well defined if the > operand is a _Bool object holding a representation of 0 or 1. > > Conversion from _Bool to any scalar type for an object holding some > representation other than 0 or 1 either yields 0 or 1 (depending > on the low-order bit) or has undefined behavior. I did a sample now.. #include int main() { union { int i; _Bool b; } data; data.i = 123; printf("%d", data.b); } it printed 123 not 1. So I think the assignment and cast covers all/most cases. (From some previous tests I thought this was printing 1) The motivation for C89 in cake was not to support old compilers, but generate code that is compatible with C++98. In this aspect bool was already there in C++98.(This just gave me idea to add target c++98)