user4678657
user4678657

Reputation:

Execution output of program

Why does the below given program prints -128

#include <stdio.h>
main()
{
    char i = 0;
    for (; i >= 0; i++)
        ;
    printf("%d",i);
}

Also can I assign int value to char without type-casting it. And if I used a print statement in for loop it prints till 127 which is correct but this program current prints -128. Why

Upvotes: 4

Views: 68

Answers (2)

nalzok
nalzok

Reputation: 16107

According to N1570, whether a char is signed is implementation-defined:(Emphasis mine)

6.2.5 Types

15 The three types char, signed char, and unsigned char are collectively called the character types. The implementation shall define char to have the same range, representation, and behavior as either signed char or unsigned char.

If it's unsigned, it will never overflow:

9 The range of nonnegative values of a signed integer type is a subrange of the corresponding unsigned integer type, and the representation of the same value in each type is the same. A computation involving unsigned operands can never overflow, because a result that cannot be represented by the resulting unsigned integer type is reduced modulo the number that is one greater than the largest value that can be represented by the resulting type.

For example, suppose UCHAR_MAX == 127(usually it'll be 255, though), 127 + 1 = (127 + 1) % (UCHAR_MAX + 1) = (127 + 1) % (127 + 1) = 0.

But if it's signed, the behavior is undefined, which means anything can happen. CHAR_MAX + 1 can be equal to CHAR_MIN, 0, or whatever. What's more, "undefined behavior" indicates that the program is possible to crash, although it's not very likely in practice.

In your case, it seems that char is signed, and CHAR_MAX + 1 == CHAR_MIN. Why? Just because your implementation defined so, and your are lucky enough to miss a crash this time. But this is not portable and reliable at all.

Upvotes: 2

Bathsheba
Bathsheba

Reputation: 234635

If char is a signed type on your platform then the behaviour of the program is undefined: overflowing a signed type is undefined behaviour in C.

A 2's complement 8 bit number with a value of -128 has the same bit pattern as a unsigned 8 bit number with value +128. It seems that this is what is happening in your case. And -128 is, of course, a termination condition for your loop. (You could even call it "wraparound to the smallest negative"). But don't rely on this.

Upvotes: 5

Related Questions