从unsigned 到 singned 的转换解决办法

从unsigned 到 singned 的转换unsignedcharaa255charbbbbaaprintf( %d\n ,bb)//-1按照书上所讲的a

从unsigned 到 singned 的转换
unsigned   char   aa   =   255;
char   bb;
bb   =   aa;
printf( "%d   \n ",   bb);         //       -1
按照书上所讲的
aa在内存存放形式是                       1111   1111
放到bb里.bb的存放形式是             1111   1111       但是第一个1变成了符号位
其结果是           111   1111     =   127    
加上符号位的话,,是       -127...但结果出来的却是   -1..

请大家帮我更正我错误的原因.....

[解决办法]
负数是用补码表示的,补码表示为相应的正整数取反后加1:

127的补码为 (127取反 + 1),即0111 1111(127) 取反为 1000 0000,然后加1
得到-127的二进制为1000 0001。
而-1的补码为1111 1111