题目:
int main()
{
int n=0xab65;//0xab65转换二进制为1010 1011 0110 0101 十进制为43877
char a=(char)n;
cout<<n<<endl;//43877
n=a;
cout<<n<<endl;//101 二进制为 0110 0101
return 0;
}
【分析】
由于n的二进制为
1010 1011 0110 0101
因为char类型是占用1个字节。因此,在n的高端字节多余的部分剔除掉,保留低端与char类型占用字节大小的长度。即保留0110 0101,转换为十进制的结果就是101.
题目:
int main()
{
int n=256;//二进制为0000 0001 0000 0000
char a=(char)n;
cout<<n<<endl;//256
n=a;
cout<<n<<endl;//结果为0
return 0;
}
分析:由上题的规则可知,n强制转换之后二进制为0000 0000.即结果为0.
题目:
int main()
{
int n=128;//二进制为1000 0000
char a=(char)n;
cout<<n<<endl;//128
n=a;
cout<<n<<endl;//-128
return 0;
}
【解析】
由于128二进制为1000 0000中的1在char类型大小的最高位,即前面的所有位(即24位,一共有32位,由于char类型占用一个字节,除去8位)都置为1.如图所示:
由此可知,只要强制转换到某类型时,根据某类型的大小来保留其字节位数,再分析该字节位数的最高位是否是1,如果是1,该位数的前面所有位数都置为1.
题目:
int main()
{
int n=129;//1000 0001
char a=(char)n;
cout<<n<<endl;//129
n=a;
cout<<n<<endl;//-127
return 0;
}
【解析】
对比上一题可知,该保留下来的字节位数的最高位如果是1,则就处于负数状态。当该保留字节中的数值越大,则结果也就是越大。例如130,结果为-126。以此类推,当达到1111 1111时,也就是255,其结果为-1。当达到256时,即1 0000 0000,由于保留位数为低端的一个字节,即0000 0000,则结果为0.
扫描二维码关注公众号,回复:
6494671 查看本文章
题目:
int main()
{
double n=-1;
int a=(int)n;
cout<<n<<endl;//-1
n=a;
cout<<n<<endl;//-1
return 0;
}
【解析】
由于double是双精度浮点类型,是包含小数点的,当double含有小数时,强制转换成int型是最主要的作用。但对于浮点数类型,存储方式是比较复杂的。
枚举问题:
enum weekday{sun,mon,tue,wed=4,thu,fri,sat};
weekday workday =mon;
cout<<workday+web<<endl;//结果为5
【解析】
枚举成员默认第一个成员的值为0,接着第二个成员为1,下一个成员也就加1。若设置某成员的值,则这个成员的下一个成员的值为其前一个成员的值加1。