Reputation: 9
I am new to C and having a hard time understanding why the code below prints out ffffffff
when binary 1111111
should equal hex ff
.
int i;
char num[8] = "11111111";
unsigned char result = 0;
for ( i = 0; i < 8; ++i )
result |= (num[i] == '1') << (7 - i);
}
printf("%X", bytedata);
Upvotes: 0
Views: 242
Reputation: 5741
You print bytedata
which may be uninitialized.
Replace
printf("%X", bytedata);
with
printf("%X", result);
Your code then run's fine. code
Although it is legal in C, for good practice you should make
char num[8] = "11111111";
to
char num[9] = "11111111";
because in C the null character ('\0') always appended to the string literal. And also it would not compile as a C++ file with g++.
EDIT
To answer your question
If I use char the result is FFFFFFFF but if I use unsigned char the result is FF.
Answer:
Case 1:
In C size of char is 1byte(Most implementation). If it is unsigned we can
use 8bit and hold maximum 11111111
in binary and FF
in hex(decimal 255). When you print it with printf("%X", result);
, this value implicitly converted to unsigned int which becomes FF
in hex.
Case 2: But when you use char(signed), then MSB bit use as sign bit, so you can use at most 7 bit for your number whose range -128 to 127 in decimal. When you assign it with FF
(255 in decimal) then Integer Overflow occur which leads to Undefined behavior.
Upvotes: 4