Deutsch   English   Français   Italiano  
<v9602l$60n0$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: Fri, 9 Aug 2024 18:01:09 -0300
Organization: A noiseless patient Spider
Lines: 207
Message-ID: <v9602l$60n0$1@dont-email.me>
References: <v8vlo9$2oc1v$1@dont-email.me> <slrnvb7kis.28a.dan@djph.net>
 <v929ah$3u7l7$1@dont-email.me> <87ttfu94yv.fsf@nosuchdomain.example.com>
 <v93a3t$6q7v$1@dont-email.me> <v93e2q$8put$1@dont-email.me>
 <v94smd$mgp8$1@dont-email.me> <v95j4r$qh1q$3@dont-email.me>
 <v95okr$2oa92$1@dont-email.me> <87ikw9788w.fsf@nosuchdomain.example.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8; format=flowed
Content-Transfer-Encoding: 8bit
Injection-Date: Fri, 09 Aug 2024 23:01:10 +0200 (CEST)
Injection-Info: dont-email.me; posting-host="358699822bb9c263f3cfeb8ab794a410";
	logging-data="197344"; mail-complaints-to="abuse@eternal-september.org";	posting-account="U2FsdGVkX1/XHz6FVTntN9V9poaRB3B6Gu4xgg4xQtM="
User-Agent: Mozilla Thunderbird
Cancel-Lock: sha1:G/kGUpYSCJqpGMSiYspC+1/CDAA=
In-Reply-To: <87ikw9788w.fsf@nosuchdomain.example.com>
Content-Language: en-GB
Bytes: 9732

Em 8/9/2024 5:26 PM, Keith Thompson escreveu:
> Thiago Adams <thiago.adams@gmail.com> writes:
>> Em 8/9/2024 2:20 PM, David Brown escreveu:
>>> On 09/08/2024 12:57, Thiago Adams wrote:
>>>> Em 8/8/2024 6:41 PM, Bart escreveu:
>>>>> On 08/08/2024 21:34, Thiago Adams wrote:
>>>>>> On 08/08/2024 16:42, Keith Thompson wrote:
>>>>>>> Thiago Adams <thiago.adams@gmail.com> writes:
>>>>>>>> On 07/08/2024 17:00, Dan Purgert wrote:
>>>>>>>>> On 2024-08-07, Thiago Adams wrote:
>>>>>>> [...]
>>>>>>>>>> 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.
>>>>>>>
>>>>>>> Who is "they"?
>>>>>>>
>>>>>>> Some CPUs have floating-point registers, some don't.  C says nothing
>>>>>>> about registers.
>>>>>>>
>>>>>>> What exactly is your question?  Is it not already answered by reading
>>>>>>> the "Conversions" section of the C standard?
>>>>>>>
>>>>>>
>>>>>>
>>>>>> This part is related with the previous question about the origins
>>>>>> of integer promotions.
>>>>>>
>>>>>> We don't have "char" register or signed/unsigned register. But I
>>>>>> believe we may have double and float registers. So float does not
>>>>>> need to be converted to double.
>>>>>>
>>>>>> There is no specif question here, just trying to understand the
>>>>>> rationally behind the conversions rules.
>>>>>
>>>>> The rules have little to do with concrete machines with registers.
>>>>>
>>>>> Your initial post showed come confusion about how conversions
>>>>> work. They are not performed 'in-place', any more than writing `a
>>>>> + 1` changes the value of `a`.
>>>>>
>>>>> Take:
>>>>>
>>>>>       int a; double x;
>>>>>
>>>>>       x = (double)a;
>>>>>
>>>>> The cast is implicit here but I've written it out to make it
>>>>> clear. My C compiler produces intermediate code like this before
>>>>> converting it to native code:
>>>>>
>>>>>       push x   r64                   # r64 means float64
>>>>>       fix      r64 -> i32
>>>>>       pop  a   i32
>>>>>
>>>>> I could choose to interprete this code just as it is. Then, in
>>>>> this execution model, there are no registers at all, only a stack
>>>>> that can hold data of any type.
>>>>>
>>>>> The 'fix' instruction pops the double value from the stack,
>>>>> converts it to int (which involves changing both the bit-pattern,
>>>>> and the bit-width), and pushes it back onto the stack.
>>>>>
>>>>> Registers come into it when running it directly on a real
>>>>> machine. But you seem more concerned with safety and correctness
>>>>> than performance, so there's probably no real need to look at
>>>>> actual generated native code.
>>>>>
>>>>> That'll just be confusing (especially if you follow the advice to
>>>>> generate only optimised code).
>>>>>
>>>>>
>>>>>
>>>>>
>>>> This part was always clear to me:
>>>>
>>>> "They  are not performed 'in-place', any more than writing `a + 1`
>>>> changes the value of `a`."
>>>>
>>>> Lets take double to int.
>>>>
>>>> In this case the bits of double needs to be reinterpreted (copied
>>>> to) int.
>>>>
>>>> So the answer "how it works" can be
>>>>
>>>> always/generally machine has a instruction to do this
>>>>
>>>> or.. this is defined by the IIE ... standard as ...
>>>>
>>>>
>>> It would be helpful if you made more of an effort to write clearly
>>> here.   (We know you can do so when you want to.)  It is very
>>> difficult to follow what you are referring to here - what is "this
>>> case" here?  A conversion from a double to an int certainly does not
>>> re-interpret or copy bits - like other conversions, it copies the
>>> /value/ to the best possible extent given the limitations of the
>>> types.
>>
>> Everything is a bit mixed up, but I'll try to explain the part about
>> registers that I have in mind.
> 
> Why you keep talking about registers?  The C standard does not talk
> about registers, and the promotion rules are based on which *operations*
> are available, not what kinds of registers a given CPU happens to have.
> 

I use "register" to talk about how hardware works.

>> In C, when you have an expression like char + char, each char is
>> promoted to int. The computation then occurs as int + int.
> 
> Right.  And the most important thing to keep in mind is that it works
> that way *because the C standard says so*.
> 
> If you're looking for a rationale for this, it's probably because some
> early C compilers were for target systems that didn't provide operations
> on narrow types.  (The PDP-11 does have instructions that operate on
> 8-bit bytes, but the arithmetic instructions operate only on 16-bit
> words.)  But the C standard rules apply to all conforming C
> implementations.  If a target CPU happens to provide a 1-byte add
> instruction, a C compiler can't use it unless it can prove that the
> result is consistent with C semantics.
> 
> Knowing why the C standard says what it says can be interesting, but
> it's not necessarily directly useful.
> 
>> On the other hand, when you have float + float, it remains as float + float.
> 
> That's implementation-defined.  Read the "Characteristics of floating
> types <float.h>" section of the C standard (it's 5.2.5.3.3 in the N3220
> draft) and look for FLT_EVAL_METHOD.  If FLT_EVAL_METHOD (defined in
> <float.h>) is 0, float operations are done in type float.  If it's 1,
> float operations are done in type double.  If it's 2, all floating-point
> operations are done in type long double.
> 
>> My guess for this design is that computations involving char are done
>> using registers that are the size of an int.
> 
> Who says the target CPU even has registers, or that computations can't
> be done directly on values in memory?
> 
>> But, float + float is not promoted to double, so I assume that the
>> computer has specific float registers or similar operation
>> instructions for float.
> 
> Again, some CPUs have floating-point registers and some do not.  Those
> that don't might store floating-point values in the same registers used
> for integer values, applying different instructions to operate on them.
> Of those that do have floating-point registers, some have registers that
> can hold a double value (typically 64 bits); they may or may not be able
> to treat a half-register as a 32-bot float value.
> 
> The rules in the C standard are, for the most part, based on the
> capabilities of CPUs that existed when the standard was written, not
> necessarily on modern CPUs (though there have been tweaks in later
> editions).
> 
>> Regarding the part about signed/unsigned registers and operations, I
>> must admit that I'm not sure. I was planning to check on Compiler
>> Explorer, but I haven't done that yet.
>>
>> I can frame the question like this: Does the computer make a
>> distinction when adding signed versus unsigned integers? Are there
>> specific assembly instructions for signed versus unsigned operations,
>> covering all possible combinations?
> 
> Maybe.
========== REMAINDER OF ARTICLE TRUNCATED ==========