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

//以下结果在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;
}



 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值