(计算机组成原理)第二章数据的表示和运算-第二节7:详解C语言中的强制类型转换
Posted 快乐江湖
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了(计算机组成原理)第二章数据的表示和运算-第二节7:详解C语言中的强制类型转换相关的知识,希望对你有一定的参考价值。
在学习完前面几节的内容后,相信大家对数据是如何在计算机中存储、运算的有了更加深入的认识,那么接下来我们就以更深层次的角度来看看我们熟悉的C语言中的强制类型转换
(1)无符号数和有符号数
有如下代码
int main()
{
short x=-4321;//短整型,顶点负整数
unsigned short y = (unsigned short)x;//无符号短整型
}
我们知道在计算机中数据是以补码的形式保存的,因此变量x
的补码形式为
1110 1111 0001 1111
第二句代码进行强制类型转换,把一个有符号转换为了无符号,并用无符号变量保存;在这个过程中数据的内容是没有被改变的,只是改变了解释的方式,也就说说变量y的内容依然是
1110 1111 0001 1111
但是在解释是计算机会把第一位的符号位当作数值位,因此y对应的真值是61215
(2)长整数变为短整数
有如下代码
int a=165537,b=-34991;//整形
short c=(short)a;
short d=(short)b;//强制类型转换,长整形转为短整型
这个例子中短整型为16位,整形为32位,因此将长整形转换为短整型,短整型的变量肯定不能完全保存,会丢失精度。具体规则为:高位截断,保留低位
比如a的十六进制为
0x000286a1
0010 1000 0110 1010 0001//二进制形式
使用c保存后,值为
0x86a1
1000 0110 1010 0001//二进制形式
1000 0110 1010 0001
是c的补码,属于有符号数,是一个负数,其原码(负数原码等于补码除符号位按位取反后+1)为1111 1001 0101 1111
,对应真值-31071
再比如,b的十六进制为
0xffff7751
1111 1111 1111 1111 0111 0111 0101 0001//二进制形式
使用d保存后,值为
0x7751
0111 0111 0101 0001//二进制形式
0111 0111 0101 0001
是d的补码,属于有符号数,是一个正数,其原码(正数原码和补码一致)为0111 0111 0101 0001
,对应真值30545
(3)短整数变为长整数
有如下代码
short x=-4321;//短整型
int m=x;//使用整形保存短整型
unsigned short n=(unsigned short)x;//将x强制转为为无符号,然后复制给无符号短整型
unsigned int p = n;//把无符号短整型n变为无符号整形
这属于之前讲到过的符号扩展问题。这里x是一个负数,所以会在符号位和原有的数值位之间添上1,这样做最后的结果不改变,只是补码的长度发生改变
unsigned short n=(unsigned short)x
将x这个有符号短整型转换为了无符号短整型,计算机会将其补码原封不动的赋值给n,但是会按照无符号的规则解析真值,真值为61215
unsigned int p = n
属于无符号到无符号的转换,直接填0即可。
以上是关于(计算机组成原理)第二章数据的表示和运算-第二节7:详解C语言中的强制类型转换的主要内容,如果未能解决你的问题,请参考以下文章
(计算机组成原理)第二章数据的表示和运算-第二节5:定点数乘法运算(原码/补码一位乘法)
(计算机组成原理)第二章数据的表示和运算-第二节4:定点数的加减运算和溢出判断
(计算机组成原理)第二章数据的表示和运算-第二节6:定点数除法运算(原码/补码一位除法)
(计算机组成原理)第二章数据的表示和运算-第二节3:定点数的移位运算(算数移位逻辑移位和循环移位)