C语言隐式类型转换(字符类型以及短整型的运算规则)
C的整型算术运算总是至少以缺省整型类型的精度来进行的。
为了获得这个精度,表达式中的字符和短整型操作数在使用之前被转换为普通整型,这种转换称为整型提升。
举个例子:
char a = 127;
char b = 3;
char c = a + b;
printf("%d",a+b);
printf("%d",c);
什么是整型提升?上面这段代码的输出结果又是什么呢?
整型提升的意义:
表达式的整型运算要在CPU的相应运算器件内执行,CPU内整型运算器(ALU)的操作数的字节长度一般就是int的字节长度,同时也是CPU的通用寄存器的长度。因此,即使两个char类型的相加,在CPU执行时实际上也要先转换为CPU内整型操作数的标准长度。
通用CPU(general-purpose CPU)是难以直接实现两个8比特字节直接相加运算(虽然机器指令中可能有这种字节相加指令)。所以,表达式中各种长度可能小于int长度的整型值,都必须先转换为int或unsigned int,然后才能送入CPU去执行运算。
简单来说,当我们在进行字符(或者短整型)类型的运算时,它们需要提升到整形之后在进行运算,拿字符类型来说,一个字符变量的大小是一个字节,也就是他们需要提升到整形的大小之后(也就是字节字节)之后再进行运算,如果我们把他们放到另一个变量中,那么计算后的四个字节的结果会发生截断,重新变成一个字节。整形提升的过程,是一直向左复制符号位,直到达到四个字节的大小。具体过程如下图。
所以,我们有符号的char类型,存储数字的范围就是(-128~127),而无符号的char类型存储的范围就是(0~255) 。当有符号的char类型的存储的为(10000000)时,无法进行转换,所以规定为-128。短整型来进行计算时也是如此。
算术转换:
如果某个操作符的各个操作数属于不同的类型,那么除非其中一个操作数的转换为另一个操作数的类型,否则操作就无法进行。下面的层次体系称为寻常算术转换。
long double
double
float
unsigned long int
long int
unsigned int
int
如果某个操作数的类型在上面这个列表中排名较低,那么首先要转换为另外一个操作数的类型后执行运算。
C语言隐式类型转换(字符类型以及短整型的运算规则)相关推荐
- C 语言格式输出 %hd,%hu分别是 短整型 和 无符号的短整型。
C 语言格式输出 %hd,%hu分别是 短整型 和 无符号的短整型. %hd,%hu分别是 短整型 和 无符号的短整型. posted on 2011-08-22 20:29 雨亭 阅读( ...) ...
- 短整型转字符数组,字符数组转短整型
一.短整型转字符数组 void main() {char num[2];short int a = 299;num[0] = (char)a ;num[1] = (char) (a >> ...
- C 语言隐式类型转换
前言 C 语言隐式执行的类型转换,让我们难以捉摸.有时默默进行的类型转化会导致难忘的经历,我曾经就因 -1 > 1 这个表达式为真,找了一个多小时的 bug.你可能会想 -1 怎么可能大于 1, ...
- C语言 - 隐式类型转换
文章目录 一.整型提升 1.什么是整型提升 2.整型提升的意义 3.如何进行整型提升 4.通过代码验证整型提升的存在 二.算术转换 一.整型提升 1.什么是整型提升 C语言的整型算术运算总是至少以缺省 ...
- python隐式类型转换_JS 类型隐式转换
1.js数据类型 js中有7种数据类型,可以分为两类:原始类型.对象类型: 基础类型(原始值): Undefined. Null. String. Number. Boolean. Symbol (e ...
- 隐式类型转换和整型提升
c整型中的运算总是至少以缺省整型类型的精度来进行的,所以当字符型或者短整型在进行运算时为了获得这个精度,先要提升成普通整型,再运算. 例: char a=127; char b=1; char ret ...
- C语言----表达式求值之隐式类型转换
前言: 表达式求值的顺序一部分是由操作符的优先级和结合性决定. 同样,有些表达式的操作数在求值的过程中可能需要转换为其他类型,称为隐式类型转换,下面给出隐式类型转换的详细讲解,希望对大家有所帮助~ 隐 ...
- c语言float转换为int_C语言的隐式类型转换和显示类型转换
C语言是一种强类型语言,当使用一种类型的对象代替另外一种类型的对象进行操作时,必须首先进行类型转换. 类型转换的方式,一般可分为隐式类型转换和显示类型转换(也称为强制类型转换). 1.隐式类型转换 隐 ...
- C语言操作符详解 隐式类型转换 (整型提升 算数转换)
目录 一.算术操作符 二.左移操作符 右移操作符 1.二进制序列 2.左移操作符 3.右移操作符 3.1.逻辑运算/算术运算 3.2.对于移位运算符,不要移动负数位,这是标准未定义的 3.3.对于移位 ...
最新文章
- js 获取URL后面的参数
- java中解决Launch configuration TimezoneDump references non-existing project问题
- reactjs创建虚拟DOM的两种方式:使用jsx和js创建虚拟DOM
- eclipse启动不了并报错Java was started but exit with code 13 问题解决
- 焦旭超 201771010109《面向对象程序设计课程学习进度条》
- android thread实例
- ThinkPHP删除指定文件(物理删除) 点击链接可查看详情(对学习可有很大的帮助的...
- Tensorflow官方文档学习理解 (四)-深入MNIST
- 单细胞测序的marker基因
- 为什么别人报价成单,而你不行?
- 大数据离线阶段Day5之多彩缤纷数据源
- html中3d图片轮播图,js实现图片3D轮播效果
- 计算机开机一直无法访问,电脑开机时显示:AutoIt 错误 不能打开脚本文件 如何处理...
- 压缩图片大小至指定Kb以下
- windows操作系统基础总结
- Docker入门实战---修改Docker镜像源
- android camera 废弃,Android相机android.hardware.Camera已弃用
- Java中JVM虚拟机详解
- 【C语言】scanf,getchar,getch函数详解
- 常规串口驱动CH340的安装