la*************@techway.fr wrote:
Hello,
I would like to print a signed octal.
With a signed short it's printf %hi but what about an octal ?
The octal ("%o") and hex ("%x" or "%X") specifiers are for unsigned
values. If you truly want to print values as signed, consider code like
the following. You might also want to think about what things might be
done better. Note that if you start with a signed int value, you should
probably memmove or memcpy it to an unsigned int used as the argument
for show_signed_octal (unless you _know_ your clever pointer trick is
legal and works).
#include <stdio.h>
#include <limits.h>
void show_signed_octal(unsigned int a)
{
if (a <= INT_MAX)
printf("argument a = %#o is non-negative.\n\n", a);
else {
printf("argument a = %#o is negative,\n ", a);
a = 1 + ~a;
printf(" 1 + ~a = -%#o, \n", a);
a = 1 + ~a;
printf(" 1 + ~(1 + ~a) = %#o.\n\n", a);
}
}
int main(void)
{
unsigned int x = 0, increment = UINT_MAX / 13, i;
show_signed_octal(0);
for (i = 1; i < 14; i++) {
x += increment;
show_signed_octal(x);
}
show_signed_octal((unsigned) INT_MIN);
show_signed_octal((unsigned) INT_MAX);
show_signed_octal(UINT_MAX);
return 0;
}
[Output for one implementation]
argument a = 0 is non-negative.
argument a = 02354235423 is non-negative.
argument a = 04730473046 is non-negative.
argument a = 07304730471 is non-negative.
argument a = 011661166114 is non-negative.
argument a = 014235423537 is non-negative.
argument a = 016611661162 is non-negative.
argument a = 021166116605 is negative,
1 + ~a = -016611661173,
1 + ~(1 + ~a) = 021166116605.
argument a = 023542354230 is negative,
1 + ~a = -014235423550,
1 + ~(1 + ~a) = 023542354230.
argument a = 026116611653 is negative,
1 + ~a = -011661166125,
1 + ~(1 + ~a) = 026116611653.
argument a = 030473047276 is negative,
1 + ~a = -07304730502,
1 + ~(1 + ~a) = 030473047276.
argument a = 033047304721 is negative,
1 + ~a = -04730473057,
1 + ~(1 + ~a) = 033047304721.
argument a = 035423542344 is negative,
1 + ~a = -02354235434,
1 + ~(1 + ~a) = 035423542344.
argument a = 037777777767 is negative,
1 + ~a = -011,
1 + ~(1 + ~a) = 037777777767.
argument a = 020000000000 is negative,
1 + ~a = -020000000000,
1 + ~(1 + ~a) = 020000000000.
argument a = 017777777777 is non-negative.
argument a = 037777777777 is negative,
1 + ~a = -01,
1 + ~(1 + ~a) = 037777777777.