I am trying to run the following code but confused with what's happening here:
int main()
{
/*
a = -1;
b = 0xffffffff;
*/
if(-1 == 0xffffffff )
printf("-1 is equal to maximum\n");
else
printf(" -1 is not equal to maximum\n");
if(0xff < -1)
printf(" Less than -1 \n");
if(0xff < 0xffffffff)
printf(" Less than maximum\n");
I tried with commented section as well and replaced -1 with "a" and 0xffffffff with "b" but the result is same .
It's 32 bit system so i have taken integer size 4 bytes.
My Output is :
-1 is equal to maximum
Less than maximum
If -1 is equal to maximum then it should execute both of the last two if statements. But it's not happening. Why?
I'll quote this from C++; I think it's the same for C:
The literal -1
is always a signed int
.
The literal 0xff
is a signed int
, but 0xffffffff
is an unsigned int
.
In comparisons of mixed signs, both operands are converted to unsigned, explaining all your results.
Here's the rule about the types of naked integral literals (i.e. without type suffix) from C++11, table 6:
Decimal literals are of the smallest type among int
, long int
or long long int
, whichever fits.
Hexadecimal literals are of the smallest type among int
, unsigned int
, long int
, unsigned long int
, long long int
, unsigned long long int
, whichever fits.
To spell it out again:
In your first comparison, both sides are converted to unsigned int
, giving the value 0xFFFFFFFF
.
In the second comparison, both terms are signed integers, and the left term is 255
and the right term is -1
.
In the third comparison, both terms are converted to unsigned int
.
Observe that we never needed to worry about hardware implementations of signedness for this question. The only relevant platform-dependent value is the size of int
, which we used when we asserted that 0xffffffff
does not fit into an int
but does fit into an unsigned int
.
In C/C++, negative numbers are stored in 2's compliment format and Most Significant Bit(MSB) acts as a sigh indication.
MSB 1 means -ve and MSB 0 means +ve. 1xxxxxxxxxx is -ve number and 0xxxxxxxxxx means +ve. In 1xxxxxxx the "xxxxxx" is 2's compliment of a number. And in 0xxxxxx the "xxxxx" is actual binary representation of a number.
Compiler interpret number as -ve if MSB(sign bit) is 1 and understands the number has to be the two's compliment.
First lets see what is 2's compliment:
2's compliment is negating an actual number(all bits) and then adding 1.
decimal 1 = 00000001
~ decimal 1 = 11111110
2's compliment of decimal 1 = 11111111 (F hex)
so -1 becomes = (1) 111111111111111
(1) is a MSB indicating -ve number the rest is the 2's compliment of a number.
thus -1 = 0xFFFFFFFF
You can try out printing binary representation of some -ve numbers and comparing the 2's compliment of binary representation of a number.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With