Groups | Search | Server Info | Keyboard shortcuts | Login | Register
Groups > comp.lang.c > #387403
| From | Bart <bc@freeuk.com> |
|---|---|
| Newsgroups | comp.lang.c |
| Subject | Re: how cast works? |
| Date | 2024-08-08 19:01 +0100 |
| Organization | A noiseless patient Spider |
| Message-ID | <v9316l$4msg$2@dont-email.me> (permalink) |
| References | (2 earlier) <v929ah$3u7l7$1@dont-email.me> <v92gt1$e1l$1@dont-email.me> <20240808193203.00006287@yahoo.com> <v92va5$4msg$1@dont-email.me> <v930ga$4mni$1@dont-email.me> |
On 08/08/2024 18:50, Thiago Adams wrote:
> On 08/08/2024 14:29, Bart wrote:
>> On 08/08/2024 17:32, Michael S wrote:
>> > On Thu, 8 Aug 2024 14:23:44 +0100
>> > Bart <bc@freeuk.com> wrote:
>> >> Try godbolt.org. Type in a fragment of code that does different kinds
>> >> of casts (it needs to be well-formed, so inside a function), and see
>> >> what code is produced with different C compilers.
>> >>
>> >> Use -O0 so that the code isn't optimised out of existence, and so
>> >> that you can more easily match it to the C ource.
>> >>
>> >>
>> >
>> >
>> > I'd recommend an opposite - use -O2 so the cast that does nothing
>> > optimized away.
>> >
>> > int foo_i2i(int x) { return (int)x; }
>> > int foo_u2i(unsigned x) { return (int)x; }
>> > int foo_b2i(_Bool x) { return (int)x; }
>> > int foo_d2i(double x) { return (int)x; }
>> The OP is curious as to what's involved when a conversion is done.
>> Hiding or eliminating code isn't helpful in that case; the results can
>> also be misleading:
>>
>> Take this example:
>>
>> void fred(void) {
>> _Bool b;
>> int i;
>> i=b;
>> }
>>
>> Unoptimised, it generates this code:
>>
>> push rbp
>> mov rbp, rsp
>>
>> mov al, byte ptr [rbp - 1]
>> and al, 1
>> movzx eax, al
>> mov dword ptr [rbp - 8], eax
>>
>> pop rbp
>> ret
>>
>> You can see from this that a Bool occupies one byte; it is masked to
>> 0/1 (so it doesn't trust it to contain only 0/1), then it is widened
>> to an int size.
>>
>> With optimisation turned on, even at -O1, it produces this:
>>
>> ret
>>
>> That strikes me as rather less enlightening!
>>
>> Meanwhile your foo_b2i function contains this optimised code:
>>
>> mov eax, edi
>> ret
>>
>> The masking and widening is not present. Presumably, it is taking
>> advantage of the fact that a _Bool argument will be converted and
>> widened to `int` at the callsite even though the parameter type is
>> also _Bool. So the conversion has already been done.
>>
>> You will see this if writing also a call to foo_b2i() and looking at
>> the /non-elided/ code.
>>
>> The unoptimised code for foo_b2i is pretty awful (like masking twice,
>> with a pointless write to memory between them). But sometimes with gcc
>> there is no sensible middle ground between terrible code, and having
>> most of it eliminated.
>>
>> The unoptimised code from my C compiler for foo_b2i, excluding
>> entry/exit code, is:
>>
>> movsx eax, byte [rbp + foo_b2i.x]
>>
>> My compiler assumes that a _Bool type already contains 0 or 1.
>>
>>
>>
>
> If you are doing constant expression in your compiler, then you have the
> same problem (casts) I am solving in cake.
>
> For instance
> static_assert((unsigned char)1234 == 210);
>
> is already working in my cake. I had to simulate this cast.
>
> Previously, I was doing all computations with bigger types for constant
> expressions. Then I realize compile time must work as the runtime.
>
> For constexpr the compiler does not accept initialization invalid types.
> for instance.
>
> constexpr char s = 12345;
>
> <source>:6:21: error: constexpr initializer evaluates to 12345 which is
> not exactly representable in type 'const char'
> 6 | constexpr char s = 12345;
>
>
> I am also checking all wraparound and overflow in constant expressions.
> I have a warning when the computed value is different from the math value.
In my C compiler I have no constexpr (don't know why you got that
impression). And I don't check that initialisers for integer types
overflow their destination.
This is because within the language in general:
char c; int i;
c = i;
Such an assignment is not checked at runtime (and I don't know if this
can be warned against, or if a runtime check can be added).
This is just how C works: too-large values are silently truncated (there
are worse aspects of the language, like being able to do `int i;
(&i)[12345];`).
But you are presumably superimposing a new stricter language on top. In
the case, if my `c = i` assignment was not allowed, how do I get around
that; by a cast?
Back to comp.lang.c | Previous | Next — Previous in thread | Next in thread | Find similar
how cast works? Thiago Adams <thiago.adams@gmail.com> - 2024-08-07 08:28 -0300
Re: how cast works? Thiago Adams <thiago.adams@gmail.com> - 2024-08-07 08:33 -0300
Re: how cast works? Keith Thompson <Keith.S.Thompson+u@gmail.com> - 2024-08-07 13:13 -0700
Re: how cast works? Tim Rentsch <tr.17687@z991.linuxsc.com> - 2024-08-11 17:43 -0700
Re: how cast works? Vir Campestris <vir.campestris@invalid.invalid> - 2024-08-12 11:51 +0100
Challenge/exercise problem - signum() function Tim Rentsch <tr.17687@z991.linuxsc.com> - 2024-08-12 08:17 -0700
Re: Challenge/exercise problem - signum() function Lew Pitcher <lew.pitcher@digitalfreehold.ca> - 2024-08-12 16:07 +0000
Re: Challenge/exercise problem - signum() function Tim Rentsch <tr.17687@z991.linuxsc.com> - 2024-08-12 09:57 -0700
Re: how cast works? Dan Purgert <dan@djph.net> - 2024-08-07 20:00 +0000
Re: how cast works? Keith Thompson <Keith.S.Thompson+u@gmail.com> - 2024-08-07 13:26 -0700
Re: how cast works? Lawrence D'Oliveiro <ldo@nz.invalid> - 2024-08-07 23:00 +0000
Re: how cast works? Thiago Adams <thiago.adams@gmail.com> - 2024-08-08 08:14 -0300
Re: how cast works? Bart <bc@freeuk.com> - 2024-08-08 14:23 +0100
Re: how cast works? Michael S <already5chosen@yahoo.com> - 2024-08-08 19:32 +0300
Re: how cast works? Thiago Adams <thiago.adams@gmail.com> - 2024-08-08 14:11 -0300
Re: how cast works? Bart <bc@freeuk.com> - 2024-08-08 18:29 +0100
Re: how cast works? Thiago Adams <thiago.adams@gmail.com> - 2024-08-08 14:50 -0300
Re: how cast works? Thiago Adams <thiago.adams@gmail.com> - 2024-08-08 14:57 -0300
Re: how cast works? Bart <bc@freeuk.com> - 2024-08-08 19:01 +0100
Re: how cast works? Thiago Adams <thiago.adams@gmail.com> - 2024-08-08 15:13 -0300
Re: how cast works? Keith Thompson <Keith.S.Thompson+u@gmail.com> - 2024-08-08 12:29 -0700
Re: how cast works? David Brown <david.brown@hesbynett.no> - 2024-08-08 19:58 +0200
Re: how cast works? Bart <bc@freeuk.com> - 2024-08-08 20:09 +0100
Re: how cast works? David Brown <david.brown@hesbynett.no> - 2024-08-09 00:32 +0200
Re: how cast works? Keith Thompson <Keith.S.Thompson+u@gmail.com> - 2024-08-08 16:14 -0700
Re: how cast works? Lawrence D'Oliveiro <ldo@nz.invalid> - 2024-08-09 02:47 +0000
Re: how cast works? Keith Thompson <Keith.S.Thompson+u@gmail.com> - 2024-08-08 22:55 -0700
Re: how cast works? James Kuyper <jameskuyper@alumni.caltech.edu> - 2024-08-09 02:08 -0400
Re: how cast works? David Brown <david.brown@hesbynett.no> - 2024-08-09 18:16 +0200
Re: how cast works? Keith Thompson <Keith.S.Thompson+u@gmail.com> - 2024-08-09 12:18 -0700
Re: how cast works? Tim Rentsch <tr.17687@z991.linuxsc.com> - 2024-08-11 17:07 -0700
Re: how cast works? Keith Thompson <Keith.S.Thompson+u@gmail.com> - 2024-08-11 20:14 -0700
Re: how cast works? Bart <bc@freeuk.com> - 2024-08-09 01:56 +0100
Re: how cast works? David Brown <david.brown@hesbynett.no> - 2024-08-09 19:08 +0200
Re: how cast works? Bart <bc@freeuk.com> - 2024-08-10 11:03 +0100
Re: how cast works? Lawrence D'Oliveiro <ldo@nz.invalid> - 2024-08-09 02:45 +0000
Re: how cast works? Keith Thompson <Keith.S.Thompson+u@gmail.com> - 2024-08-08 12:42 -0700
Re: how cast works? Thiago Adams <thiago.adams@gmail.com> - 2024-08-08 17:34 -0300
Re: how cast works? Bart <bc@freeuk.com> - 2024-08-08 22:41 +0100
Re: how cast works? Keith Thompson <Keith.S.Thompson+u@gmail.com> - 2024-08-08 16:17 -0700
Re: how cast works? Bart <bc@freeuk.com> - 2024-08-09 11:04 +0100
Re: how cast works? David Brown <david.brown@hesbynett.no> - 2024-08-09 19:12 +0200
Re: how cast works? Bart <bc@freeuk.com> - 2024-08-12 15:36 +0100
Re: how cast works? James Kuyper <jameskuyper@alumni.caltech.edu> - 2024-08-09 13:57 -0400
Re: how cast works? Bart <bc@freeuk.com> - 2024-08-09 21:59 +0100
Re: how cast works? Keith Thompson <Keith.S.Thompson+u@gmail.com> - 2024-08-09 14:47 -0700
Re: how cast works? Bart <bc@freeuk.com> - 2024-08-10 00:32 +0100
Re: how cast works? Keith Thompson <Keith.S.Thompson+u@gmail.com> - 2024-08-09 17:12 -0700
Re: how cast works? James Kuyper <jameskuyper@alumni.caltech.edu> - 2024-08-09 18:29 -0400
Re: how cast works? David Brown <david.brown@hesbynett.no> - 2024-08-13 11:18 +0200
Re: how cast works? Bart <bc@freeuk.com> - 2024-08-13 11:34 +0100
Re: how cast works? James Kuyper <jameskuyper@alumni.caltech.edu> - 2024-08-13 07:51 -0400
Re: how cast works? Bart <bc@freeuk.com> - 2024-08-13 14:01 +0100
Re: how cast works? Keith Thompson <Keith.S.Thompson+u@gmail.com> - 2024-08-13 12:46 -0700
Re: how cast works? Bart <bc@freeuk.com> - 2024-08-13 21:51 +0100
Re: how cast works? Tim Rentsch <tr.17687@z991.linuxsc.com> - 2024-08-13 16:46 -0700
Re: how cast works? Bart <bc@freeuk.com> - 2024-08-14 00:56 +0100
Re: how cast works? Tim Rentsch <tr.17687@z991.linuxsc.com> - 2024-08-18 03:37 -0700
Re: how cast works? Keith Thompson <Keith.S.Thompson+u@gmail.com> - 2024-08-09 14:29 -0700
Re: how cast works? James Kuyper <jameskuyper@alumni.caltech.edu> - 2024-08-09 18:35 -0400
Re: how cast works? Kaz Kylheku <643-408-1753@kylheku.com> - 2024-08-09 21:30 +0000
Re: how cast works? Keith Thompson <Keith.S.Thompson+u@gmail.com> - 2024-08-09 14:57 -0700
Re: how cast works? Kaz Kylheku <643-408-1753@kylheku.com> - 2024-08-09 23:14 +0000
Re: how cast works? Keith Thompson <Keith.S.Thompson+u@gmail.com> - 2024-08-09 16:58 -0700
Re: how cast works? Kaz Kylheku <643-408-1753@kylheku.com> - 2024-08-10 00:06 +0000
Re: how cast works? Keith Thompson <Keith.S.Thompson+u@gmail.com> - 2024-08-09 17:27 -0700
Re: how cast works? James Kuyper <jameskuyper@alumni.caltech.edu> - 2024-08-09 20:31 -0400
Re: how cast works? Bart <bc@freeuk.com> - 2024-08-10 01:11 +0100
Re: how cast works? David Brown <david.brown@hesbynett.no> - 2024-08-13 11:23 +0200
Re: how cast works? Tim Rentsch <tr.17687@z991.linuxsc.com> - 2024-08-11 17:32 -0700
Re: how cast works? James Kuyper <jameskuyper@alumni.caltech.edu> - 2024-08-09 18:35 -0400
Re: how cast works? Tim Rentsch <tr.17687@z991.linuxsc.com> - 2024-08-11 17:27 -0700
Re: how cast works? Keith Thompson <Keith.S.Thompson+u@gmail.com> - 2024-08-09 12:23 -0700
Re: how cast works? Bart <bc@freeuk.com> - 2024-08-09 21:31 +0100
Re: how cast works? Keith Thompson <Keith.S.Thompson+u@gmail.com> - 2024-08-09 13:49 -0700
Re: how cast works? Bart <bc@freeuk.com> - 2024-08-09 22:01 +0100
Re: how cast works? Tim Rentsch <tr.17687@z991.linuxsc.com> - 2024-08-12 00:33 -0700
Re: how cast works? Bart <bc@freeuk.com> - 2024-08-12 12:21 +0100
Re: how cast works? Tim Rentsch <tr.17687@z991.linuxsc.com> - 2024-08-11 17:46 -0700
Re: how cast works? Bart <bc@freeuk.com> - 2024-08-12 02:00 +0100
Re: how cast works? Keith Thompson <Keith.S.Thompson+u@gmail.com> - 2024-08-11 20:23 -0700
Re: how cast works? Tim Rentsch <tr.17687@z991.linuxsc.com> - 2024-08-11 20:37 -0700
Re: how cast works? Keith Thompson <Keith.S.Thompson+u@gmail.com> - 2024-08-11 21:33 -0700
Re: how cast works? Ben Bacarisse <ben@bsb.me.uk> - 2024-08-12 16:57 +0100
Re: how cast works? Tim Rentsch <tr.17687@z991.linuxsc.com> - 2024-08-12 10:04 -0700
Re: how cast works? Keith Thompson <Keith.S.Thompson+u@gmail.com> - 2024-08-12 13:35 -0700
Re: how cast works? Thiago Adams <thiago.adams@gmail.com> - 2024-08-09 07:57 -0300
Re: how cast works? Bart <bc@freeuk.com> - 2024-08-09 16:25 +0100
Re: how cast works? Keith Thompson <Keith.S.Thompson+u@gmail.com> - 2024-08-09 12:06 -0700
Re: how cast works? David Brown <david.brown@hesbynett.no> - 2024-08-09 19:20 +0200
Re: how cast works? Thiago Adams <thiago.adams@gmail.com> - 2024-08-09 15:54 -0300
Re: how cast works? Thiago Adams <thiago.adams@gmail.com> - 2024-08-09 16:05 -0300
Re: how cast works? David Brown <david.brown@hesbynett.no> - 2024-08-09 21:43 +0200
Re: how cast works? Keith Thompson <Keith.S.Thompson+u@gmail.com> - 2024-08-09 13:28 -0700
Re: how cast works? David Brown <david.brown@hesbynett.no> - 2024-08-09 22:01 +0200
Re: how cast works? Bart <bc@freeuk.com> - 2024-08-10 11:17 +0100
Re: how cast works? Thiago Adams <thiago.adams@gmail.com> - 2024-08-10 10:15 -0300
Re: how cast works? Bart <bc@freeuk.com> - 2024-08-10 17:14 +0100
Re: how cast works? Thiago Adams <thiago.adams@gmail.com> - 2024-08-10 20:01 -0300
Re: how cast works? Keith Thompson <Keith.S.Thompson+u@gmail.com> - 2024-08-10 17:10 -0700
Re: how cast works? Thiago Adams <thiago.adams@gmail.com> - 2024-08-11 09:23 -0300
Re: how cast works? Bart <bc@freeuk.com> - 2024-08-11 13:30 +0100
Re: how cast works? Thiago Adams <thiago.adams@gmail.com> - 2024-08-11 14:16 -0300
Re: how cast works? Keith Thompson <Keith.S.Thompson+u@gmail.com> - 2024-08-11 13:38 -0700
Re: how cast works? Bart <bc@freeuk.com> - 2024-08-12 12:24 +0100
Re: how cast works? Keith Thompson <Keith.S.Thompson+u@gmail.com> - 2024-08-09 13:26 -0700
Re: how cast works? Thiago Adams <thiago.adams@gmail.com> - 2024-08-09 18:01 -0300
Re: how cast works? Keith Thompson <Keith.S.Thompson+u@gmail.com> - 2024-08-09 14:53 -0700
Re: how cast works? Keith Thompson <Keith.S.Thompson+u@gmail.com> - 2024-08-09 12:03 -0700
Re: how cast works? Thiago Adams <thiago.adams@gmail.com> - 2024-08-09 16:22 -0300
Re: how cast works? David Brown <david.brown@hesbynett.no> - 2024-08-09 00:36 +0200
Re: how cast works? Dan Purgert <dan@djph.net> - 2024-08-08 14:08 +0000
Re: how cast works? Lawrence D'Oliveiro <ldo@nz.invalid> - 2024-08-09 02:42 +0000
Re: how cast works? Keith Thompson <Keith.S.Thompson+u@gmail.com> - 2024-08-07 13:08 -0700
Re: how cast works? Thiago Adams <thiago.adams@gmail.com> - 2024-08-08 08:35 -0300
Re: how cast works? Keith Thompson <Keith.S.Thompson+u@gmail.com> - 2024-08-08 12:39 -0700
Re: how cast works? James Kuyper <jameskuyper@alumni.caltech.edu> - 2024-08-08 18:40 -0400
Re: how cast works? Tim Rentsch <tr.17687@z991.linuxsc.com> - 2024-08-11 17:15 -0700
Is there an audio book version (Was: how cast works?) gazelle@shell.xmission.com (Kenny McCormack) - 2024-08-08 16:19 +0000
Re: how cast works? Lawrence D'Oliveiro <ldo@nz.invalid> - 2024-08-07 23:03 +0000
csiph-web