| Deutsch English Français Italiano |
|
<v94smd$mgp8$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 07:57:17 -0300 Organization: A noiseless patient Spider Lines: 93 Message-ID: <v94smd$mgp8$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> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit Injection-Date: Fri, 09 Aug 2024 12:57:17 +0200 (CEST) Injection-Info: dont-email.me; posting-host="358699822bb9c263f3cfeb8ab794a410"; logging-data="738088"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX1+XUwWJz4j+GstVL6G9udnwFFda0iAJ1HM=" User-Agent: Mozilla Thunderbird Cancel-Lock: sha1:QJanoL7PpK9G17l3+HcuGSD8nlc= Content-Language: en-GB In-Reply-To: <v93e2q$8put$1@dont-email.me> Bytes: 4240 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 ...