localhost
localhost

Reputation: 9

c and bit shifting in a char

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

Answers (1)

ashiquzzaman33
ashiquzzaman33

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

Related Questions