关于C语言环境中计算机计算的一些细节

我们都知道一台计算机有它对应的CPU,CPU也叫做中央处理器,计算机在对数据进行处理时,会把数据输送到CPU中进行相应的处理。

在C语言的语言环境中,整形算数运算总是以(默认)整形类型的精度进行计算的(int),为了获得这个精度,表达式中字符和短整型操作数在使用之前会被转化为普通的整形,这种转换称为整型提升!

例如下列代码:

代码中a和b都是字符类型(字符类型也归结为整形家族),我们知道,一个整形在计算机中是以二进制的补码形式存在的。

首先,把20的值赋给了a,20在计算机中的二进制补码形式为00000000000000000000000000010100

当我们把20赋值给a时,但是a此时为char类型,其在内存中的大小为1个字节,故此时会发生截断,即20的补码中的00010100会赋值给到a。

同理可以知道此时120中的01111110会被赋值给b。

接下来是a+b的结果赋值给char c,由上面的结论可以知道,计算机在计算的时候会进行整型提升的操作,那么整形提升的规则是什么呢?

整形提升是根据短整型的二进制的符号位进行补位操作,比如上面的a,此时a在计算机中储存的是二进制00010100,此时,要发生整型提升,根据它的符号位为0,则补位成32个比特即4个字节,此时a的补码就会提升为00000000000000000000000000010100。

对于b也是同理可得b的整型提升后为00000000000000000000000001111110。

此时完成了整形提升的部分,接下来就是用此时的a和b的补码进行相加,也就是说00000000000000000000000000010100

+

00000000000000000000000001111110

其结果为00000000000000000000000010001100

但是由于c为char类型,之呢个储存一个字节,这时又会发生截断,所以此时c储存的二进制数为

10001100

接下来是用%d的形式打印出c,%d是以十进制的形式,打印出一个有符号的整形(int)。

固然,此时c又要发生整形提升,由于此时c的补码符号位为1,故整型提升后c的补码为11111111111111111111111110001100。

此时c符号位为1,则为负数,故原码为补码取反加1,则此时c的原码为10000000000000000000000001110100

故此时打印出来的结果应为-166!!!

以上为个人理解,如果有错误请帮忙指出,谢谢大家!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值