首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

又是一个看似简单但易错的C语言试题,来试一下?

今天看到了一个比较有意思的C语言题目,看似简单,但里面的几个陷阱和考察的知识点比较有代表性,拿出来与大家分享一下:

问题很简单,就问会输出什么?大家可以先自己思考一下,我们就直接给出运行结果了:

是不是很奇怪,怎么会出现了255,-1是没问题的。别急,下面我们一步一步分析:

先来分析a和b的值:

我们首先要明白的是,在计算机中整数通常采取补码的形式存储负数的补码等于其反码+1,负数的反码符号位不变,数值为按位取反。对于 signed char 型变量,大部分C语言编译器都是由 8 个 bit 组成的,最高一个 bit 通常表示符号位。

再来分析 c 和 d 的值:

按理说,a 和 b 在内存中的布局是一样的,都是 8 个 bit 的 1,为什么传递给 c 和 d 就不一样了呢?其实C语言在处理 c = a; 和 d = b; 这两句赋值语句时,有一个过程没有显式的表现出来,即“整形提升”。以 c=a; 为例,因为 c 和 a 的数据类型不同,所以C语言在处理赋值时,为了不丢失精度,会将 a 中的数值也强制转换为 int 型。

a 中的数值是 -1,提升为 int 型后依然是 -1,而不是 0x000000ff(255,这里假设 int 类型占用 4 字节内存空间)。至于变量 d 的值,就更简单了,就是简单的赋值而已。

怎么样,到这里大家应该都清楚了,其实这道题目主要涉及了整数存储方式(补码反码)和整形提升(无符号数和有符号数)两个知识点,都属于C编程中的基本功,希望此题对大家有帮助,感谢耐心阅读!

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20200219A0RJFN00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券