char str [4];
sprintf (str, "%.2x", 0x01);//Conversion of byte to the 2nd bit hexadecimal value
I expect in str[0] 0 character, in str[1] 1 character, that is '0' and '1'. As a result function returns '1' and 'C'. Remaining numbers - it is normal...
The reason is, that you only give ONE byte as value (0x01) and %x expects a TWO byte value. Then two bytes are used with only one valid, the other just undefined.
Therefore you may cast that value to 16bits like
sprintf (str, "%.2x", (unsigned int)0x01);
The reason is, that you only give ONE byte as value (0x01) and %x expects a TWO byte value.
Total and absolute rubbish!
If you want to get 2 digits from sprintf, you need to change it to
sprintf (str, "%2.2x", 0x01)
Separate note: This is such a strange forum, I was told my message was in error because it contained the spam word Wod. Took me too long to notice it was embedded in "two digits".
Maybe I'm naive, but i don't see why that word would be considered spam.
I appreciate your "Total and absolute rubbish". Well, I have it tested, confirmed the problem in the first place, and the fix using 16bit. Beside that, the problem is also visible using just a simple "%x" format sting. And I do really assume that YOU have also reproduced and tested your fix, don't you? I will not use inappropiate wording in my response, sorry.
You might also carefully read
http://www.keil.com/support/man/docs/c51/c51_printf.htm
and there understand the difference between %bx and %x, another option to solve the primary problem:
printf ("xchar %bx xint %x xlong %lx\n",x,y,z);
Got it? Reading helps!
Oh dear. Why post a link to a page that you've clearly not fully comprehended?
Nice to see active discussion.
As an arbitrator I will say that both of you are right. The (unsigned int) is there to ensure a 16 bit value is passed as a parameter and the 2.2X to ensure the resultant string consists of two hex characters. There are likely many ways to do it, but the combination works for me. In the same way that any of the C51 workarounds for the weird architecture ever made sense.
IMHO, the sooner the x51 is taken out of college teaching the better.
All thanks for discussion. Works correctly: sprintf (str, "%.2x", (unsigned int)0x01) sprintf (str, "%2.2x", (unsigned int)0x01) There is a question. Why in Embarcadero® C++Builder 10.1 Berlin transformation of types isn't required.
And yes. MCS51 shouldn't offend. :) Similar it is just such realization of the sprintf function in the environment of KEIL.
There is a question. Why in Embarcadero® C++Builder 10.1 Berlin transformation of types isn't required.
A better question is: Why does C51 require it?
The C51 compiler does an extremely good job of making C and its libraries available to a processor that is not really suitable for such things. It requires a number of extensions to make best use of the limited resources of the old processors.
But things have really moved on since the 1990s (I was an original tester of quite a few C51 releases back in those days). Many processors (such as ones having an ARM Cortex core) don't require these extensions and 'just work'.
My suggestion to you is move across to the currently available processors and technologies as soon as you can. You'll find things a whole lot easier :)
But in case of what here processor type? It is feature of implementation of function in the environment of KEIL, only...