对部分整型(char)操作的测试

来源:互联网 发布:qq飞车战魂评测数据 编辑:程序博客网 时间:2024/05/17 23:05
//以下结果在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的值是-1a=0xffU;//b对应内存的二进制序列为11111111,由于它是无符号的,所以b的真值为255unsigned 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型数据运算要快--markcout<<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型的推论有出处,故本文仅供大家作测试参考//不具有技术价值,如果有比较了解这方面的大神看了这篇文章希望能解答下--markcout<<(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;}