Today in Bo asked to see a friend's problem, roughly in the network program, printed out of the 16 number, inexplicable appearance ffffff. For example, a byte is really worth 0xc9, and printing out is 0xffffffc9. The original Bo asked the connection as follows: http://q.cnblogs.com/q/71073/
In fact, a similar problem is not only in the network program will appear, see the Sample code:
1#include <stdio.h>2 intMain ()3 { 4 Charc =0xc9; 5printf"a:c =%2x\n", (unsignedChar) c); 6printf"b:c =%2x\n", C &0xFF); 7printf"c:c =%2x\n", c); 8 return 0; 9}
The program output is as follows:
A:C == = Ffffffc9
can see:
Converting c to unsigned char printing is correct. As a condition.
C and 0xFF do & operation after printing correctly. As a condition B.
c do not do any processing, the problem is reproduced, print out FFFFFFC9. As a situation c.
Situation a B is my Baidu to solve the C phenomenon of the method. So let's now analyze and explain the ABC three cases one by one.
First we have to know that the printf () function's%x (x) outputs the 16 binary format of the int type. So c variables of char type are converted to int type.
Secondly, we know that the computer uses the complement to represent the data. For the original code, anti-code, complementary knowledge, please charge yourself.
Case C:
C's Complement: 11001001 (0XC9).
C's anti-code: 11001000 (0XC9).
The original code of C: 10110111 (0XC9).
Because the char type is signed, the highest bit of 1 is considered a minus.
Convert c to int type char-----> int
Int_c The original code: 10000000 00000000 00000000 00110111 (the highest digit of the C source code is referred to the highest bit.) The remaining highs are 0).
Anti-code for Int_c: 11111111 11111111 11111111 11001000
Int_c's complement: 11111111 11111111 11111111 11001001 (0XFFFFFFC9).
So it's reasonable to print out a seemingly bizarre value. How to avoid it? See AB case.
Case B:
int_c's complement: 11111111 11111111 11111111 11001001 ( 0XFFFFFFC9).
& /span>
00000000 00000000 00000000 11111111
The end result is:00000000 00000000 00000000 11001001 (0xc9).
case A:
/span>
C's Complement: 11001001 (0XC9).
C's anti-code:11001001(0xc9).
The original code of C:11001001(0xc9).
Here the cast c is unsigned char type. So the highest bit of 1 is not the plus sign
Convert c to int type char-----> int
The original code of Int_c: 00000000 00000000 00000000 11001001(the highest bit of the C original code is referred to the highest bit 1. The remaining highs are 0).
Int_c Anti-code:00000000 00000000 00000000 11001001
Int_c's complement:00000000 00000000 00000000 11001001(0xc9).
So the print is normal.
The above analysis, if there is an incorrect place please correct me.
C language Printing 16 binary 0xffffff phenomenon problem analysis!