一道C语言坑爹题
来源:互联网 发布:淘宝店铺联盟报名入口 编辑:程序博客网 时间:2024/05/22 02:29
请写出以下代码输出结果:
#include <stdio.h>int main(){ char c; unsigned char uc; unsigned short us; c = 128; uc = 128; us = c + uc; printf("0x%x\n", us); us = (unsigned char)c + uc; printf("0x%x\n", us); us = c + (char)uc; printf("0x%x\n", us); return 0;}
看答案之前,自己试一试
怎么样?有没有被类型转换搞得一脸懵逼?
好吧, 我们来看看到底怎么解:
首先来看看C语言中的类型转换原则:
同时在C语言中存在一种Integer Promotion(整型提升)机制:
简单地说就是如果在char, short这类字长短的类型在做运算时会先转换为int型,运算结束后再根据需要的结果类型做截取(具体请查阅详细资料)
这样做的目的是因为在通用CPU的运算器中操作数都是int类型,很难直接实现两个8比特字节直接相加运算,因此需要先转换为int便于CPU做运算
有了这个知识点,我们再来看这道题:
char取值范围是:-128~127
unsigned char取值范围是:0~255
因此,变量c被赋值128,而它在内存中的实际值是-128
当它被整型提升时,是这样存储的(以下所有超出的字节中的位数都是运算时根据数据类型的自动补全,只在运算时有作用并不参与实际存储):
而uc是这样存储的:
所以,c+uc为:
所以,第一次输出为“0x0”;
第二次,c被强制转换为unsigned char所以它与uc的补全后存储格式都是
相加后的结果为
所以,第二次输出结果为“0x100”(注意这里是16进制输出,四个二进制位是一个十六进制为,unsigned short占两个字节,也就是占4个十六进制位,每次输出也就是只截取最低位的两个字节)
第三次,uc被强制转换为char所以它与c的补全后存储格式都是
相加后的结果为
所以,第三次输出结果为“0xff00”(因为unsigned short占两个字节,所以只截取最低位两个字节输出)
- 一道C语言坑爹题
- 一道C语言题
- 一道C语言题目
- 一道C语言考题
- 一道C语言题(2)
- 一道C语言面试题
- 一道C语言的题目
- C 语言的一道题~
- 一道C语言程序题
- 一道C语言笔试题
- 一道C语言编码题
- 一道C语言改错题
- 一道c语言指针问题!
- 一道大学c语言作业题
- 每天一道C语言题目
- 一道C语言面试题
- 一道C语言测试题
- 记一道c语言题
- block inline和inlineblock区别
- 六月随想
- MapReduce——java.lang.NoSuchMethodException错误原因
- Maven搭建web项目,启动Tomcat报错!!!
- 经典网络的 TensorFlow 实现资源汇总
- 一道C语言坑爹题
- iMX6UL 4秒快速启动 -飞凌嵌入式i.MX6UL开发板 启动速度升级
- linux查看CPU性能及工作状态的指令vmstat,mpstat,iostat,sar,top
- linux系统下mongodb添加账号密码
- CodeForces 812A Sagheer and Crossroads
- OpenGL-2D(Cohen-Sutherland 裁线算法)
- iOS自带实现高斯模糊效果
- PHP入门之编写html页面的常用标签
- 最大子数组和最大值平均子数组