前言——数据类型

在介绍数据类型转换之前,我们首先要清楚一个知识点:数据类型的级别高低
我们所提到的数据类型,比如整数型int浮点型float,它们在计算机中其实是以二进制–也就是0和1的方式存储在计算机的内存中。
在计算机中,一个字节是8个bite,也就是8个0和1组成的。这样我们就可以通过不同的0和1的组合来储存不同的数据。例如,我们要存储整形7–在计算机内是00000000 00000000 00000000 00000111来进行的储存。

那么怎样存储这么多不同的数据内型呢?
如果我们对于所有的数据类型都使用相同字节,有些数据类型不需要那么大的空间就可以进行存储,这就会造成浪费空间;而有些需要多个字节才能描述的数据类型,那么会使得空间不够,会造成数据失真。所有,我们对于不同的数据类型开辟不同的内存空间,该内存空间的大小能够存储完全描述具体数据类型的信息。
具体的有关数据类型是怎样通过0和1来表达的可以看一下的链接:

int类型在计算机中的存储
浮点数(float和double)在计算机底层的存储机制
(这是我认为两篇可以很好理解的博客)

(将整形和浮点型理解后,其他的数据类型都可以很好的理解其底层存储原理)

自动类型转换

在大致的了解了数据类型在底层上是如何储存之后,我们可以根据开辟储存空间的大小,将数据类型分为不同的级别:long double , double , flaot , unsigned long long , long long , unsigned long , long , unsigned int , int , unsigned short , short , unsigned char , char
(其中unsigned 表示是无符号的数据类型,在开辟的空间大小上,其实是一样大的)
对于unsigned和signed的区别可以看一下下面的这篇博客,能够稍稍理解一二:
unsigned和signed(默认)的区别

当使用不同的字节空间来存储数据类型之后,如果我们将两个不同的数据类型来进行表达式运算会怎么样?
其实在计算机内,只能够以相同的数据类型来进行运算,那么在进行表达式运算的时候,就会把两种不同数据类型的数据转会为较高级别的数据类型。这时候,计算机就会进行自动的类型转换。

  1. 如果在表达式中涉及到类型转换时,unsigned char,char,unsigned short和short都会转换为int,如果有必要则会被转换成unsigned int。

    原因如下:

    (因为short,int,long其实都是整数类型,只是开辟存储空间的大小不同,c语言中只规定了short占用的存储空间不多于int,long占用的存储空间不小于int——也就是short<=int<=long。那么当short=int时——指的是存储空间的大小——就会有unsigned short比int大,这种情况下unsigned short就不在转换为int了,而是转换为unsigned int类型)

  2. 涉及两种数据类型的运算的时候,两个值会被转换为两者间的更高级的那一者
    (比如3 + 2.00——‘3’是int类型的变量,‘2.00’是double类型——在编译器中,浮点型常量默认为是double类型的——那么这个表达式中,明显‘2.00’的级别更高,所以‘3’会被转换为‘3.00’的double类型,这个表达式的结果就是‘5.00’)

  3. 在赋值表达式中,计算的结果会被转换为被赋值变量的数据类型——这个过程不是数据类型向高级别转换,它取决于被赋值变量的数据类型,被赋值变量的数据类型是啥,就转换为啥数据类型。

在赋值表达式中,计算的结果会被转换为被赋值变量的数据类型——这个过程不是数据类型向高级别转换,它取决于被赋值变量的数据类型,被赋值变量的数据类型是啥,就转换为啥数据类型。
(由较小类型转换到较大的类型,这种转化被称为升级(promotion,而把一种数据类型转换成更低级别的类型,这中转换被称为降级(demotion。)
例如:我开辟一个整型变量a,来进行上述表达式的运算,我们已经知道右边的表达式的结果为‘5.00。
现在左边为int类型的变量,右边为double类型的value值,进行赋值运算,所以应该将‘5.00’转换为‘5’赋值到a中。

#include<stdio.h>
int main()
{int a;a = 2 + 3.00;return 0;
}

通过打断点进行监视,我们发现确实和分析的是相同的

  1. 当作为函数参数传递的时候,char和short被转换成int,float被转换成double。(在此不做详细介绍)

类型的升级通常是不会有什么问题的,但是类型的降级却会导致真正的麻烦。原因也很简单:较低类型可能放不下整个数字。例如,一个8位的char类型变量,最大能存储的是0~255,现在存储整数101没有什么问题,但是如果是整数22553,则存储不小。

  • 如果把一个浮点值转换成整数类型会怎样呢?

当浮点类型被降级位整数类型的时候,原来的浮点值会被截断。例如23.12和23.99会被截断为23。

#include<stdio.h>
int main()
{int a;a = 23.99;return 0;
}

  • 如果是int类型转换为char型是怎样的呢?

大部分的系统中int是32位的,char是8位的,当int转换为char时,是去int的最后一个字节,也就是最后一个8位的。例如将1107转换为char型

在这里我们可以看到整数1107的二进制数为
00000000 00000000 00000100 01010011
所以它的后八位是01010011,转换为整数就是83

#include<stdio.h>
int main()
{char a;a = 1107;printf("%c", a);return 0;
}


至于这里打印的是S,而不是83,是因为这是char型的数据类型,在ASCII码中83对应的就是S。
(可以去看一下ASCII码和char的具体讲解)

强制类型转换

  • 对于强制类型转换,c语言提供了强制类型转换运算符(cast operator
    其通用的形式为:
    type

举个例子:

int mice1,mice2;
mice1 = 1.6+1.7;
mice2 = (int)1.6 + (int)1.7;

我们根据前面讲的,1.6 + 1.7都是double型,所以可以不用类型转换而进行运算,得到的值为3.1。这个时候,进行赋值运算,将3.1转换成整形int,将小数部分截断。所以得到mice1 = 3。
而在第二个表达式中,我们使用了强制转换运算符,在还没进行加法运算的时候,将1.7和1.6转换成了int类型。1.6转换为int型,将小数部分截断,变为1;同理,1.7转换为int类型也变成了1。然后在进行加法运算1+1=2,所以可以得到mice2=2。


我们可以看到与分析的一样mice1 =3,mice2 =2。

(当我们需要进行精确的类型转换的时候,或者在程序中表明类型转换的意图,这时,就需要用到强制类型转换。)

【c语言】c语言的自动类型转换和强制类型转换相关推荐

  1. java类型转换答案,在java中支持两种类型的类型转换,自动类型转换和强制类型转换。父类转化为子类需要强制转换。...

    在java中支持两种类型的类型转换,自动类型转换和强制类型转换.父类转化为子类需要强制转换. 更多相关问题 计算机病毒通过()传染扩散得极快,危害最大. 当一个现象的数量由小变大,另一个现象的数量相反 ...

  2. JAVA语法——自动类型转换和强制类型转换

    package 自动类型转换和强制类型转换;public class 自动类型转换和强制类型转换 {public static void main(String[] args){byte b = 12 ...

  3. (基础)JavaScript类型转换(强制类型转换+隐式类型转换)

    JavaScript  中有五种基本数据类型(其中包括 String.Number.Boolean.Function.Symbol).三种对象类型(其中包括 Object.Date.Array)和两种 ...

  4. 类型转换、强制类型转换

    目录 一.类型转换 二.隐式类型转换 三.算术转换 四.降级 五.强制类型转换 一.类型转换 有些表达式的操作数在求值的过程中需要先转换成其他类型再进行运算,这一操作称为数据类型转换. 有些人会问,为 ...

  5. C语言自动类型转换和强制类型转换详解,C语言强制类型转换 - 地狱的烈火的个人页面 - OSCHINA - 中文开源技术交流社区...

    C语言中的类型转换 C语言中的类型转换有两种,自动与强制. 它们都有几种情况,如不同长度的转换:不同类型的转换:还有无符号与有符号数之间的转换.关键是两点,即长度不同时如何转换,在有无符号数参与时如何 ...

  6. 2.2.3 C语言中的整数类型及类型转换(为什么强制类型转换值发生改变?带你从机器码的角度分析)

    文章目录: 首先看一下c语言整数数据类型范围 1.有符号数和无符号数的转换(相同字长) 2.不同字长整数之间的转换 (1)大字长变量向小字长变量强制类型转换 (2)小字长变量向大字长变量强制类型转换 ...

  7. 类的自动转换和强制类型转换

    类型转换 将一个标准类型变量的值赋值给另一种标准类型的变量时,如果这两种类型兼容,则C++自动将这个值转换为接收变量的类型. long count = 8; //int类型转换为long类型 doub ...

  8. 自动类型转换和强制类型转换

    自动类型转换: 在Java中,任何情况下,整数类型的字面值默认当成int类型处理 小容量可以自动转换成大容量,这种操作被称为自动类型转换 容量大小的定义: 容量大小不是指数据类型的字节数,而是指这个数 ...

  9. 基本数据类型转换 || 自动类型转换与强制类型转换

    基本数据类型转换 自动类型转换 强制类型转换

最新文章

  1. 五分钟体验SpringBoot+Skywalking
  2. 单向环形列表及应用场景(约瑟夫环)
  3. Node.js CLI 工具最佳实践
  4. Android面试题算法之二叉树
  5. c++ 命令行错误: 无法打开 元数据 文件_PostgreSQL:强大的开源对象关系数据库管理系统...
  6. 浅谈FTP服务的几个知识点
  7. Python 机器学习:多元线性回归
  8. 从王者荣耀看设计模式(四.简单工厂模式)
  9. 排名算法(一)--PageRank
  10. 手把手Java爬虫教学 - 1. 了解爬虫
  11. 从输入URL到页面展现的全过程
  12. 为什么房价不能跌,房租必须涨
  13. 高可用、全集成、定制化,蚂蚁金服自动化测试如何演进
  14. python-shixian考拉兹猜想
  15. 微信企业号__开发记录__二次验证
  16. 搭建通过路由器连接到光猫的服务器
  17. python使用aip库识别图片中文字
  18. 程序员的苦与痛,又有谁懂!改完这个bug就离职,网友:大佬牛逼
  19. flowable6.4 并行网关 驳回 跳转 回退 多实例加签减签
  20. 非激活窗口(Inactive Window)

热门文章

  1. java.lang.NoClassDefFoundError: javax/transaction/Synchronization 解决方法。
  2. 前端学习—JavaScript
  3. 基于STM32的智能篮球测温记分记时系统
  4. Qlabel显示图片
  5. 初学以太坊--环境搭建篇
  6. 打印机连接不上打印提示这个操作不受支持解决
  7. Spring Boot+JOOQ(五)进阶查询操作
  8. Java中的项目结构简述(项目、模块、包、类)
  9. ENVI5.3.1使用Landsat 8影像进行图像镶嵌和图像裁剪实例操作
  10. 一文读懂新华三引领Wi-Fi 6市场的秘密