//以下结果在win7 32位系统的VS2012下测得
#include<iostream>
using namespace std;
int main(void)
{
signed char a;
//对于大多数计算机的整型变量存放的是它的补码
//无符号数的补码就是它本身
//输出一个以二进制表示的数时(所有的数据均由二进制表示)会先进行相应的转换后输出(如:转换成10进制等等)
//下式 a=0xffU:0xffU 等价于二进制序列 11111111,所以a中的二进制为11111111,是真值的补码形式
//而a为有符号数,所以11111111对应的数是-1(将除了符号位的其它位取反后最低位加1即得到负数的原码)
//其原码为:10000001,故a的值是-1
a=0xffU;
//b对应内存的二进制序列为11111111,由于它是无符号的,所以b的真值为255
unsigned char b=a;
//下式并不会输出mark,因为将a与b的返回值先转换成int型再来比较的,所以-1<255
//从这里得出:只要是整型,并且其真值不大于int型表示范围,则均会转换成int型
//所以对表达式a==b的两个子表达式 a 和 b ,先计算出它们各自的结果后转换成int型
//而不是两个计算之后进行数据匹配再来转换)再来比较两个临时的无名的int型变量的值
if(a==b)
cout<<"mark"<<endl;
int c=a;
//输出为-1,所以将signed char变量值赋值给int型(均为有符号)并不是简单的将signed char的
//二进制序列复制到int的低阶位中,符号位是会作相应的调整的
cout<<c<<endl;
c=b;
//而对于unsigned char类型则不必做符号位调整的工作
//所以我个人猜想:计算机是不是对 unsigned int型的数据运算比对 int型数据运算要快--mark
cout<<c<<endl;
//a的值扩展为int型后其二进制序列为:10000000 00000000 00000000 01111111
//对于第二个(unsigned int)a输出的并不是255,而是int所能表示的最大整数0xffffffff--mark
//经测试发现,编译器将值为负(非负的符合上面的推断)的signed char变量的8位二进制位
//(注意,并不是将0xff分别填充到4个8位中,而是填充最低的8位,可以将0xff换成0xf0试一下)
//复制到unsigned int型的无名变量中,其高阶的24位均会填充为1,
//输出该无名变量的值
//这与上面的将a求得的值转换成 int型的推论有出处,故本文仅供大家作测试参考
//不具有技术价值,如果有比较了解这方面的大神看了这篇文章希望能解答下--mark
cout<<(int)a<<" "<<(unsigned int)a<<" "<<(unsigned int)((unsigned char)a)<<" "<<(unsigned int)b<<endl;
unsigned int d=0;
d=a;
cout<<d<<endl;
cin.get();
cin.get();
return 0;
}