一道C语言坑爹题

简介: 请写出以下代码输出结果:#include int main(){ char c; unsigned char uc; unsigned short us;...

请写出以下代码输出结果:

#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占两个字节,所以只截取最低位两个字节输出

这里写图片描述

目录
相关文章
|
30天前
|
存储 机器学习/深度学习 编译器
一篇文章,把你的C语言拉满绩点
一篇文章,把你的C语言拉满绩点
11 0
|
1月前
|
小程序 C语言
怎么学C语言?干货
怎么学C语言?干货
32 0
|
6月前
|
C语言
C语言中%c,%d,%x,%f,%4.2f分别是什么
C语言中%c,%d,%x,%f,%4.2f分别是什么
|
6月前
|
存储 人工智能 编译器
C语言:练习5
C语言:练习5
54 2
|
6月前
|
存储 C语言
C语言:练习6
C语言:练习6
26 1
|
编译器 C语言 C++
初识c语言
一个程序运行起来如果报错或者结果是上一次运行程序的结果那么就是你写的程序有问题,可以用cursor这个编码chatgpt这个软件看一下那里出现的问题,但是要保证自己的代码是完整的我们在vs2022中要创建的源文件,头文件是用来存放自定义函数的。因为我们学习的是c语言所以我们创建的文件的以.c结尾的,不能是.cpp,因为c语言的语法规则和c++的语法规则不一样,要不然写出来的程序会报错。printf()函数在程序的函数体内实现,printf(“”)是负责打印(“”)里面的字符。scanf()函数的使用。
|
Java C语言 C++
初识C语言(上)
初识C语言(上)
66 0
|
11月前
|
存储 编译器 C语言
初识C语言(3)
初识C语言(3)
69 0
|
C语言
C语言之宏详解(超级详细!)
C语言之宏详解(超级详细!)
|
存储 Go C语言
下一篇
无影云桌面