Deutsch   English   Français   Italiano  
<v92u89$4fkc$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: how cast works?
Date: Thu, 8 Aug 2024 14:11:36 -0300
Organization: A noiseless patient Spider
Lines: 93
Message-ID: <v92u89$4fkc$1@dont-email.me>
References: <v8vlo9$2oc1v$1@dont-email.me> <slrnvb7kis.28a.dan@djph.net>
 <v929ah$3u7l7$1@dont-email.me> <v92gt1$e1l$1@dont-email.me>
 <20240808193203.00006287@yahoo.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8; format=flowed
Content-Transfer-Encoding: 8bit
Injection-Date: Thu, 08 Aug 2024 19:11:37 +0200 (CEST)
Injection-Info: dont-email.me; posting-host="c24a25e0e0574963f5160c2b1c68553a";
	logging-data="147084"; mail-complaints-to="abuse@eternal-september.org";	posting-account="U2FsdGVkX1+B9OcLoiVvnFvKNA0Yjzxxlg0KbVUJeqo="
User-Agent: Mozilla Thunderbird
Cancel-Lock: sha1:2FK0odz0an5Z8OPDXh2cO3J74AU=
Content-Language: en-US
In-Reply-To: <20240808193203.00006287@yahoo.com>
Bytes: 3892

On 08/08/2024 13:32, Michael S wrote:
> On Thu, 8 Aug 2024 14:23:44 +0100
> Bart <bc@freeuk.com> wrote:
> 
>> On 08/08/2024 12:14, Thiago Adams wrote:
>>> On 07/08/2024 17:00, Dan Purgert wrote:
>>>> On 2024-08-07, Thiago Adams wrote:
>>>>> How cast works?
>>>>> Does it changes the memory?
>>>>> For instance, from "unsigned int" to "signed char".
>>>>> Is it just like discarding bytes or something else?
>>>>> [...]
>>>>
>>>> I don't know what happens when you're changing datatype lengths,
>>>> but if they're the same length, it's just telling the compiler
>>>> what the variable should be treated as (e.g. [8-bit] int to char)
>>>>   
>>>>>
>>>>> I also would like to understand better signed and unsigned.
>>>>> There is no such think as "signed" or "unsigned" register, right?
>>>>>   
>>>>
>>>> "Signed" just means the first bit indicates negative.
>>>>
>>>> So an "unsigned" 8 bit integer will have the 256 values ranging
>>>> from
>>>>
>>>>    0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 = 0
>>>>         (0b00000000)
>>>>
>>>>                 TO
>>>>
>>>>    128 + 64 + 32 + 16 + 8 +4 + 2 + 1 = 255
>>>>         (0b11111111)
>>>>
>>>>
>>>> Whereas a "signed" 8 bit integer will have the 256 values ranging
>>>> from
>>>>
>>>>     (-128) + 0 + 0 + 0 + 0 + 0 + 0 + 0 = -128
>>>>         (0b10000000)
>>>>
>>>>                 TO
>>>>
>>>>     0 + 64 + 32 + 16 + 8 + 4 + 2 + 1 = 127
>>>>         (0b01111111)
>>>>
>>>> At least in two's compliment (but that's the way it's done in C)
>>>>
>>>>   
>>>>> How about floating point?
>>>>
>>>> Floating point is a huge mess, and has a few variations for
>>>> encoding; though I think most C implementations use the one from
>>>> the IEEE on 1985 (uh, IEEE754, I think?)
>>>>   
>>>
>>>
>>>
>>> I didn't specify properly , but my question was more about floating
>>> point registers. I think in this case they have specialized
>>> registers.
>>
>>
>> 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 source.
>>
>>
> 
> 
> 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; }
> 
> etc
> https://godbolt.org/z/GWjbcG4GT
> 

To see what is the expected behavior I am doing for instance

static_assert((unsigned char)1234 == 210);