【计算机组成原理】2.2.5_2 C语言中的整数类型及类型转换

2.2.5_2 C语言中的整数类型及类型转换

00:00

好的,这小节我们要探讨一个相对来说简单的问题,就是C语言里边的那些定点整数是如何进行强制类型转换的。好,来看这样的一个例子。首先需要跟大家声明的是,C语言当中的定点整数,大家熟悉的什么int,还有什么short,还有long,这些定点整数都是用补码的形式来存储的。另外C语言里还有一个关键字叫unsigned,如果用unsigned来修饰short或者int或者long,那就意味着这个定点整数它是一个无符号数。

00:37

好,来看一下,现在有一个short行的短整数X,它的值是负的4321,那么由于是采用补码表示的,并且短整型是占两个字节,也就是16个比特,所以16个比特的补码表示-4321,应该是这样的一个值。这个大家可以自己转换一下,原码补码如何转换?这个我们之前已经强调过,不熟悉的同学可以再自己动手试一下。

01:06

好,现在我们把X这个短整型的数,把它强制转换成unsigned short,也就是无符号的短整型Y,这种强制转换的规则是:会把X的这个补码形式的数完整不变的复制给Y这个变量,由于Y也是占两个字节,所以Y的机器代码其实和X是一模一样的。只不过由于Y是一个无符号的短整型,因此计算机在解析Y的真值的时候,会按照无符号整数来进行解析。所以这个二进制无符号数转换成真值应该是对应这样的一个值。好,这是一个有符号的定点整数,转换成长度相同的无符号定点整数的一个规则。不改变数据的二进制内容,但是会改变它的解释方式。

02:08

好,再看第二个例子,如果我们把一个更长的数据,把它变成一个更短的数据,这我们定义了两个int型的变量A和B,大多数情况下C语言里边int型的数据占四个字节,那现在A和B是两个有符号的数,都用补码的形式来保存,当我们把A和B这两个数强制转换成short,也就是由四个字节变成两个字节的时候,计算机的做法是会直接把高位截断,然后只保留低位。那A对应的16进制应该是这样的,把这四个字节的内容截断,只保留最低两个字节的内容,也就是86A1,那更低的两个字节就是C这个变量的值。由于C是一个有符号的短整型,所以计算机会用补码的规则来对它进行解析,与之对应的真值就应该是这样的一个值。这是一个16比特16位的补码。

03:10

那对于B和D也是一样的,B这个数它用补码表示应该是这样的0xffff7751,把B转换成只有两个字节的d short类型,那么就是只保留更低的两个字节7751。同样的由于D它是一个有符号的短整型,所以计算机会用16比特补码的这种方式来对它进行解析,与之对应的真值是这样的一个值30545,好,这是更长的数据转换成更短的数据的一个处理方式,很残暴,就是直接截断,只保留更低的字节。好,最后再来看更短的数据转换成更长的数据。

03:49

这个问题其实我们之前聊过,也就是所谓符号扩展的问题。X原本是一个两个字节的补码,总共占16位,那么把型的X转换成四字节的int型计算机做的事情就是符号扩展。之前我们说过对于一个定点整数的补码来说,如果它是一个负数,那么我们需要在高位,也就是这个符号位和原有的数值位之间添一,用这样的方式扩展得到的补码,你把它解析为真值的话,这个真值是不会变的,只不过是补码的整体长度拓展了而已。

04:27

好,再来看N这个变量,我们把X强制的转换为无符号类型,然后把它赋值给无符号的短整型N,之前我们说过这种强制转换会把二进制代码原封不动的复制给N,只不过计算机会以无符号数的规则来解析这串机器数,那就是N所对应的一个真值。好,最后把无符号数N变成四个字节的无符号数P,那由于是无符号数到无符号数的转变,因此直接在高位添0就可以,P和N的真值,这个真值是保持不变的。好,这就是C语言里边定点整数相关的一些强制类型转换。

05:12

第一个部分探讨的是在转换的两种数据长度相同的情况下,无符号数和有符号数之间的一种转化规则,第二个部分探讨的是从长数据强转成短数据的一个处理方式,而第三个部分探讨的是从短数据转为长数据的一个转变方式。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值