Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Printf function formatter

Having following simple C++ code:

#include <stdio.h>

int main() {
    char c1 = 130;
    unsigned char c2 = 130;

    printf("1: %+u\n", c1);
    printf("2: %+u\n", c2);
    printf("3: %+d\n", c1);
    printf("4: %+d\n", c2);
    ...
    return 0;
}

the output is like that:

1: 4294967170
2: 130
3: -126
4: +130

Can someone please explain me the line 1 and 3 results?

I'm using Linux gcc compiler with all default settings.

like image 487
Daros Avatar asked Sep 17 '26 15:09

Daros


1 Answers

(This answer assumes that, on your machine, char ranges from -128 to 127, that unsigned char ranges from 0 to 255, and that unsigned int ranges from 0 to 4294967295, which happens to be the case.)

char c1 = 130;

Here, 130 is outside the range of numbers representable by char. The value of c1 is implementation-defined. In your case, the number happens to "wrap around," initializing c1 to static_cast<char>(-126).

In

printf("1: %+u\n", c1);

c1 is promoted to int, resulting in -126. Then, it is interpreted by the %u specifier as unsigned int. This is undefined behavior. This time the resulting number happens to be the unique number representable by unsigned int that is congruent to -126 modulo 4294967296, which is 4294967170.

In

printf("3: %+d\n", c1);

The int value -126 is interpreted by the %d specifier as int directly, and outputs -126 as expected (?).

like image 153
L. F. Avatar answered Sep 20 '26 06:09

L. F.



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!