Question: > 
> **Possible Duplicate:**  
> 
> [Negative ASCII value](https://stackoverflow.com/questions/4690415/negative-ascii-value) 
> 
> 
> 

```
int main() {
    char b = 8-'3';
    printf("%c\n",b);

    return 0;
}

```

I run this program and I get a sign which looks like a question mark (?).

My question to you is why is it prints that and not printing nothing, beacause as far as I know the value of b by the ASCII table is minus 43 which is not exist.

by the way, when I compile this code: 

```
int main() {
    char b = -16;
    printf("%c\n",b);

    return 0; 
}

```

I get nothing.

Answer: 
There is no such thing as a "negative ASCII" value. ASCII defines character and control codes for values from 0 to 127.

Most systems don't use plain ASCII. They use some other character set. Almost all other characters sets match ASCII for the values from 0 to 127, but they define additional characters and control codes for higher values.

In some C and C++ implementations `char` corresponds to a signed char that can take values from -127 to +127 (and in most cases from -128 to +127). In other implementations `char` is an unsigned value from 0 to 255.

If you have a signed `char` with a negative value and try to print it, the library will treat that as an `unsigned char` (e.g., -1 becomes 255), and it will print whichever character in the platform's character set corresponds to that value. If there is no character assigned to a particular value, the library may choose to display some default placeholder character, like a question mark or a box.
The `%c` formatting will always print a character, so presumably it just takes the bits of your `char` and treats it as an unsigned value, which ends up being something with the highest bit set. Your terminal may display these characters as blank or as placeholders with question marks, but mine shows Õ and ð…

If you want to print nothing when the value is negative, you need to check for it (and use either a larger data type, such as `int` so that you can fit the non-char values along with all possible chars, or `signed char` if you wish to be sure that you are getting a signed type; a plain `char` may be either signed or unsigned).