c语言查看数据类型_这道C语言题有秘密,基础不好很容易上套!让人崩溃,我太南了...

1、

要看懂今天的代码需要一点储备知识。

d4f585b153d5f8973b5ce972b83e2027.png

2、

题目及分析

话不多说上代码:

4e055b4aaaea131781d2e7d0161e79e6.png

你算出的结果是什么?

估计大部分的朋友算出的结果都是 2 。

881adae92f6fc7c2bfbf848aba615088.png

初步分析

让我们一起来看一下,大致分析这个代码,可以发现这个代码考察了两个知识点:

一是数据类型转换问题

二是运算符的优先级问题

上面这行代码,~的优先级最高,首先肯定是对a进行按位取反,然后是+的优先级较高,所以执行4+1 =5,最后执行右移操作。

因此上面的代码等价于:

也就是先对a进行逐位取反,~0xa5 = ~ (1010 0101b) = 0101 1010b = 0x5a

再右移5位得到0x2。结果算出来是2?

让我们直接运行代码来查看结果:

3d9989d3c777e19f15b3a2035b766d49.png

怎么回事?答案并不是预期中的2,b忽然等于250!,这是为什么呢?

846288de722d46ee7da2dcdcfd096569.png

隐式数据类型转换和整值提升

让我们再来仔细观察上面这行代码,发现出现了不同类型之间的运算:a的数据类型是char,4和1的数据类型没有指定,c语言编译器会默认其为int类型。

相信大家都知道,在C语言的运算过程中,如果运算符两边的数据类型不一致,编译器会自动进行隐式数据类型转换。

这种数据类型转换总体来说比较复杂,但是总体遵循这个原则:尽量避免数据精度损失

上面的原则意味着什么呢?

如果运算符两边的数据类型不一致,编译器总是尽量往较宽的数据类型进行转换。

如果计算过程中的计算数不是浮点数,那么他们肯定都是整型,编译器一般会将所有小于int类型宽度的数据类型提升到int,这种现象被称为“整值提升”

进一步分析

5aa8c605494668adf39f9ac951dd4fda.png

知道了整值提升,让我们再来重新看看上面这行代码:

a是unsigned char,数据宽度小于 int,所以编译器在对a进行按位取反操作之前,会先将a的数据类型提升至int。

不同机器上,int的数据宽度不同,在我的机器上int的大小是4个字节。

因此将a进行数据类型转换后,a = 0x 00 00 00 a5 ,按位取反以后就是 ~a = 0x ff ff ff 5a,然后再按位右移5位(高位自动补0),得到的就是0x07 ff ff fa ,在将该数值复给b的时候,因为b的数据类型是 char,只有一个字节,因此会发生数据截断,只有最低位字节保留下来了,也就是 0xfa = 250。

总结

通过这道题,大家可以发现,如果对c语言的隐式数据类型转换不熟悉,就很容易上套。

另外,运算符的优先级还是比较难记的,建议还是使用括号明确执行顺序。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值