Warning: mysqli::__construct(): (HY000/1203): User howardkn already has more than 'max_user_connections' active connections in D:\Inetpub\vhosts\howardknight.net\al.howardknight.net\includes\artfuncs.php on line 21
Failed to connect to MySQL: (1203) User howardkn already has more than 'max_user_connections' active connectionsPath: ...!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: Fri, 9 Aug 2024 16:05:21 -0300 Organization: A noiseless patient Spider Lines: 150 Message-ID: References: <87ttfu94yv.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 21:05:22 +0200 (CEST) Injection-Info: dont-email.me; posting-host="358699822bb9c263f3cfeb8ab794a410"; logging-data="2894114"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX1+drDkBOIB7cTjcYmEhOa6iGfnmeZ/sAKY=" User-Agent: Mozilla Thunderbird Cancel-Lock: sha1:bOHM8d4Q49WgMKjLXZblDFpbqcA= In-Reply-To: Content-Language: en-GB Bytes: 6558 Em 8/9/2024 3:54 PM, Thiago Adams escreveu: > 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 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. > > In C, when you have an expression like char + char, each char is > promoted to int. The computation then occurs as int + int. > > On the other hand, when you have float + float, it remains as float + > float. > > My guess for this design is that computations involving char are done > using registers that are the size of an int. > > But, float + float is not promoted to double, so I assume that the > computer has specific float registers or similar operation instructions > for float. > > 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? > > > > and I am still curious if _Bool/bool makes the programs slower (more instructions) compared with "typedef int bool" because the generated code has to convert bool->int int->bool all the time.