(计算机组成原理)第二章数据的表示和运算-第二节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:定点数的移位运算(算数移位逻辑移位和循环移位)

(计算机组成原理)第二章数据的表示和运算-第二节1:定点数的表示(原码反码补码和移码)

(计算机组成原理)第二章数据的表示和运算-第二节2:原码反码补码和移码的作用