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: 
Here's the behavior as specified in the [C 2011 standard](http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf)

> 
> ### 7.21.6.1 The fprintf function
> 
> 
> ...  
> 
> 8 The conversion speciﬁers and their meanings are:  
> 
> ...  
> 
> `c` If no `l` length modiﬁer is present, the `int` argument is converted to an
> `unsigned char`, and the resulting character is written.  
>   
> 
> If an `l` length modiﬁer is present, the `wint_t` argument is converted as if by
> an `ls` conversion speciﬁcation with no precision and an argument that points
> to the initial element of a two-element array of `wchar_t`, the ﬁrst element
> containing the `wint_t` argument to the `lc` conversion speciﬁcation and the
> second a null wide character.
> 

That -43 is being converted to an unsigned value (213), so it's printing an extended ASCII character.
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.