C语言的 (强制类型转换) 以及 '字符字面值'

C语言的显式/隐式类型转换,都有一个中间变量的存在,原数据的类型、内容都不变。

 

以下代码,都用GCC编译。

 

复制代码
 1 #include<stdio.h>
 2 
 3 int main()
 4 {
 5     char c = 'a';
 6     printf("%d %d %d\n", c, sizeof(c), sizeof((int)c));    //输出为97,1,4.  第二个sizeof的作用对象为一个int型中间变量
 7     
 8     c = 255;
 9     printf("%d\n", c);    //输出-1.  char型的c已溢出,隐式转换为int后同样保持为-1
10     printf("%d\n", (unsigned char)c); //输出255. 要想确保c强制转换后为非负数,例如作为数组下标,应先转换为unsigned char 
11 
12     return 0;
13 }
复制代码

 

  

之前以为单引号多字符,比如'123'会报错,测试了一下才发现只会警告(GCC,代码里给出警告信息),能编译通过:

复制代码
 1 #include <stdio.h>
 2 
 3 int main()
 4 {
 5     printf("%d\n", '1'        );  //输出49
 6     printf("%d\n", '12'       );  //输出12594       警告:warning: multi-character character constant
 7     printf("%d\n", '123'      );  //输出3224115     警告:同上
 8     printf("%d\n", '1234'     );  //输出825373492   警告:同上
 9     printf("%d\n", '12345'    );  //输出842216501       警告:warning: character constant too long for its type
10     printf("%d\n", '123456'   );  //输出859059510       警告:同上
11     printf("%d\n", '1234567'  );  //输出875902519       警告:同上
12     printf("%d\n", '12345678' );  //输出892745528       警告:同上
13     printf("%d\n", '123456789');  //输出909588537       警告:同上
14 
15     return 0;
16 }
复制代码

以上分别输出1~9个数字组成的字符字面值,输出类型为int型,中间有个隐式类型转换的过程。

第一行输出'1'的ASCII码值49;

第二行则将'1'和'2'的ASCII码值分别赋予int型中间变量的低位2个字节,即0x3132,所以输出为12594 = (49 << 8) + 50;警告信息提示为多字符字面值;

第三四行的结果原理同上;

第五行以下的,原理同上,但是只取低4位,例如第9行,只取'6789',即0x36373839;警告信息提示字符字面值超出int类型的字节数。

 

posted @   阿杰的专栏  阅读(1650)  评论(5编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
点击右上角即可分享
微信分享提示