C语言中的数据类型及其转换详解_枚举常量如果超过int,会转化为long int-程序员宅基地

技术标签: 数据  语言  c语言  转换  详解  数据类型  类型  

原文地址为: C语言中的数据类型及其转换详解

1. C语言中的数据类型

  C语言中的类型按其组成可以分为简单类型和构造类型,按是否预定义了类型名字和值集可以分为基本类型和非基本类型,按是否加了类型限定符可以分为限定类型和非限定类型。

  ANSI C99标准中类型定义的BNF语法如下图。

  说明:

  • typedef可以定义新数据类型,如typedef long int FOUR_BYTE_INT,即定义了和long int一样的数据类型FOUR_BYTE_INT。
  • 如果typedef时加入了类型限定符或存储区分符,比如typedef volatile char KEYBOARD,则KEYBOARD k等价于volatile char。
  • 按照一般规范,新定义的数据类型同义名需要全部大写,以免与变量名混淆。
  • 利用类型定义typedef,可以为所要表示对象指定比原数据类型更合适的名字,如typedef float SPEED。
  • 利用类型定义typedef,可以提高的程序的在不同编译器上升级的可维护性,比如有些类型在某些编译器下没有,只需要改变类型定义即可轻松维护。
  • 类型定义typedef一般用于定义比较长或复杂的名字,如struct类型,即便于书写,又提高了程序的可读性。
  • 类型定义typedef与预处理指令#define的区别:
    • 处理时间不同:前者是编译过程中,后者是编译过程前;
    • 处理方法不同:前者是类型替换,而后者是简单的字符串替换,在某些情况下不适合,比如定义多个变量的地方:
1 #define POINTER int *;
2 POINTER a,b;
      • 如果是想定义两个指针类型a,b,预处理后是int * a,b。只有a是int *,是错误的。

  ANSI C99标准中规定的数据类型如下图所示。

  说明:

  • 同一行类型的语义相同,即可以相互替代。
  • long float类型与double相同,故在C99标准中没有此类型。
  • 部分编译器也提供了unsigned float和unsigned double,最好不要使用,以免影响程序的可移植性。
  • int默认是signed,所以int, signed, signed int三者等价。其它unsigned的情况类似。char默认情况不确定。

2. C语言中数据类型的长度

  ANSI C99标准中定义了两类(四个)类型修饰符:long/short和unsigned/signed。

  C99标准规定,long类型不能比变通类型短,short类型不能比普通类型长。而unsigned与signed的区别在实现上是有无符号的区别,而是使用上是取值范围的区别,两者表示范围相同,但前者全是正数,后者关于0对称。

  说明:

  • long/short可以修饰int,long还可以修饰double。
  • unsigned/signed可以修饰int, char,不可以修饰浮点型。
  • int长度是机器的字长,short int是半个字长,long int是一个或两个字长。
  • unsigned/signed长度与普通类型一样,只是表示区间不同。

3. C语言中数据类型的转换

  类型转换分为显示和隐式两种,前者比较简单,这里只讲后者。下面是C99标准中给出的各种类型对象的基本转换规则:

  • 枚举常量:转换成int,如超出int范围,则转成long int等
  • 浮点类型:
    • 如果转成整类型,只保留整数部分,如果超出整类型表示范围,则转换错误;
    • 如果向上转成double/long double,值不变;
    • 如果向下转成float/double等,如果能用float/double表示,则正常,如果超出表示范围,则转换错误,而如果在表示范围内,但精度降低,则要依赖于编译器的处理了;
  • 整类型:short int/char/枚举类型/位域类型都可转换成int,如果超出int表示范围,则提升到unsigned int。
  • 对于二元运算符中的普通算术运算转换,C99标准给出了如下图所示的转换规则:

 

  说明:

  • 对于unsigned char和unsigned short int的整型提升问题,C99标准给出“保值”的转换方法:方法是将unsigned char和unsigned short int转换成int,如果超出表示范围,则转成unsigned int。
  • 对于表格中第五行,long int与unsigned int的情况,在vc6.0没有这样实现,是直接转成unsigned int。

4. 测试练习

1 char a = 0xb6;
2 short b = 0xb600;
3 int c = 0xb6000000;
4
5 if ( a == 0xb6) puts("a");
6 if ( b == 0xb600) puts("b");
7 if ( c == 0xb6000000) puts("c");

  答案:

  在VC或x86的gcc下,只会打印出 c ,而linux的gcc则会打印出a和c。

  解释:

  char在前两者默认是signed char,而后者默认是unsigned char。因此当整型提升时,在前两者的编译器下,三条语句分别变成如下情况:

 

1 if ( 0xffffffb6 == 0x000000b6) puts("a");
2 if ( 0xffffb600 == 0x0000b600) puts("b");
3 if ( 0xb6000000 == 0xb6000000) puts("c");

  而在linux的gcc编译下,则是下面的情况:

 

1 if ( 0x000000b6 == 0x000000b6) puts("a");
2 if ( 0xffffb600 == 0x0000b600) puts("b");
3 if ( 0xb6000000 == 0xb6000000) puts("c");

 


转载请注明本文地址: C语言中的数据类型及其转换详解
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/dearbaba_8520/article/details/82716690

智能推荐

使用Python Falcon框架快速实现简单API-程序员宅基地

文章浏览阅读5.9k次。Ubuntu下默认装了python2.7装pip(安装python包管理器)sudo apt-get install python-pip装Falcon和gunicorn(gunicorn是一个Python WSGI UNIX的HTTP服务器)pip install --upgrade falconpip install gunicorn新建一个_python falcon框架

Linux下TFTP的安装,配置和操作-程序员宅基地

文章浏览阅读83次。注:转载他人,仅供自己研究学习使用TFTP是用来下载远程文件的最简单网络协议,它其于UDP协议而实现。嵌入式linux的tftp开发环境包括两个方面:一是linux服务器端的tftp-server支持,二是嵌入式目标系统的tftp-client支持。因为u-boot本身内置支持tftp-client,所以嵌入式目标系统端就不用配置了。 xinetd(eXtended InterNET..._"linux tftp安装43 rrq \"s5800_5820x-cmw520-r1810p16.bin\" netascii"

Python爬虫反反爬:CSS反爬加密彻底破解-程序员宅基地

文章浏览阅读794次。点击“简说Python”,选择“星标公众号”福利干货,第一时间送达!@老表家的猫本文授权转载自数据EDTA禁止二次转载大家好,我是老表阅读文本大概需要 10分钟今天,爬..._eetop 反爬虫

STM32芯片--FSMC外设扩展外部SRAM-程序员宅基地

文章浏览阅读7.4k次,点赞6次,收藏49次。这里写自定义目录标题为什么要扩展外部SRAM(一)什么是SRAM简介存储器型号容量引脚配置通讯方式读写特性读取数据时序图读取数据的时序要求写入数据时序图写入数据的时序要求(二)什么是FSMC外设简介功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建..._外部sram

新手用qt控件显示本地图片_qt实现拉取一个控件显示一张照片-程序员宅基地

文章浏览阅读6.8k次,点赞4次,收藏17次。QT显示图片的方法(部分源码)这个方法太简单网上已经泛滥了,不过我还是写一下吧,无聊。1 首先,新建一个项目,使用界面文件(可以不使用,不过人生苦短,没事我就不麻烦自己了)2使用qt设计器,在界面拖入一个label(我修改其objectname为screen)与一个button。3 转到button的槽,书写相应的程序。 程序如下 需要使用并添加的头文件部分#include#_qt实现拉取一个控件显示一张照片

【YOLOv4探讨 之三】mosaic数据增强_yolo mosaic-程序员宅基地

文章浏览阅读1w次,点赞17次,收藏51次。最近太忙,久未更新,对不住大家。进入正题,我们聊一聊YOLOv4中使用的mosaic数据增强。关于mosaic数据增强相关文章不少,三个月前这个方面的学习开了个头,那时候各路诸侯都是以TensorFlow框架为主,我这里依然坚持分析研究darknet框架下的数据增强。mosaic数据增强原理YOLOv4中在载入图片数据时同步进行mosaic数据增强。mosaic数据增强基本原理就是在训练集中随机选择若干个(一般是4个)图像,经过裁剪拼接形成新的训练集元素,可以缓解训练集元素少或者增强识别能力,是cut_yolo mosaic

随便推点

C语言goto语句详解_多个goto操作可以是要同一个标签吗?-程序员宅基地

文章浏览阅读8.6k次,点赞17次,收藏51次。goto语句我们先看一个代码:int main(){ flag: printf("hehe\n"); printf("haha\n"); goto flag; return 0;}这段代码我们会死循环的一直打印hehe haha,当程序看到flag:时,他不管,直接往下走,到达goto flag时,他又回到第三行代码,就这样一直循环。C语言中提供了可以随意滥用的 goto语句和标记跳转的标号。从理论上 goto语句是没有必要的,实践中没有go_多个goto操作可以是要同一个标签吗?

21计算机考研国家线,来了!21考研国家线公布!附详细解读!-程序员宅基地

文章浏览阅读3.3k次。原标题:来了!21考研国家线公布!附详细解读!21考研人最近大概都在焦虑的等待国家线昨天中国农业大学的一条消息直接将“考研国家线”顶上热搜!这不!最新出炉的国家线就来了!21考研国家线公布! 21国家线学硕总分线上涨的门类有:经济学、历史学、理学、工学、农学、工学照顾专业。21国家线专硕总分线上涨的专业有:金融、应用统计、税务、国际商务、保险、资产评估、审计、教育、汉语国际教育、应用心理、体育、会...

学习和安装 skyeye_skyeye漏扫-程序员宅基地

文章浏览阅读771次。如果你要使用不带MMU支持的交叉编译器的话,那么需要将vendors/config/armnommu/config.arch文件中“CROSS_COMPILE”的值由“arm-linux-”改为“arm-elf-”,否则下面的make menuconfig配置完成后会报告找不到arm-linux-gcc导致编译失败。[原文:http://www.linuxsir.org/bbs/sho_skyeye漏扫

彻底删除mysql服务(清理注册表)_清理mysql注册表-程序员宅基地

文章浏览阅读4.5k次,点赞4次,收藏10次。由于安装某个项目的执行文件,提示要卸载MySQL以便它自身MySQL安装,然后我禁用了MYSQL服务,再把这个文件夹删除后,发现还是提示请卸载MYSQL服务。解决步骤:1.以管理员身份运行命令提示符cmd,输入禁用服务方式:net stop mysql //停止服务这里的mysql是你服务中的mysql名(有些可能是mysql5,或者之类)。或者 我的电脑右键->管理->服务,进入后手动禁用。2.输入sc delete mysql,删除服务。3.此时,MYSQL服务只是显示禁用状态,_清理mysql注册表

案例-做一个酒店预定小程序用的日期选择案例_小程序订酒店日历选择-程序员宅基地

文章浏览阅读6.6k次,点赞3次,收藏39次。做一个酒店预定用的日期选择案例不多说,先上效果图设计思路:根据年份和月份构建最近6个月的日历,获取每个月的第一天是星期几,空白用空对象填充,每个月需要的格子数 = 每月1号的星期数 + 每月对应的天数。在HTML中遍历日期数据,根据条件判断高亮显示入住时间、离店时间以及两者之间的时间。一下是全部代码(优化在最后). <!-- html代码 --> <view..._小程序订酒店日历选择

lol佐伊美图-程序员宅基地

文章浏览阅读1.6k次。  心血来潮,分享一波从各个网站上搜集到的佐伊美图,持续更新!(最近更新日期:2019/07/01)  本页面图片较多,若无法全部加载请反复刷新页面,点击图片可查看原始大图!Section1 暮光星灵2018/11/162019/02/152019/03/172019/07/01Section2 ...

推荐文章

热门文章

相关标签