C语言的整形提升

1、算术转换

  许多运算符都会引发转换,以类似的方式产生结果类型,这个模式称为“寻常算术转换”。

  首先,任何类型为char或short的操作数被转换为int,任何类型为float的操作数被转换为double。其次,如果其中一个操作数类型为double,那么另一个操作数被转换为double,计算结果类型也是double。再次,如果其中一个操作数类型为long,那么另一个操作数被转换为long,计算结果类型也为long。或者,其中一个操作数的类型数unsigned,那么另一个操作数被转换为unsigned,计算结果类型也为unsigned。如果不符合上面几种情况,那么两个操作数的类型都为int,计算结果类型也为int。

2、字符和整数

  char,short int或int型位段,包括它们的有符号或无符号变形,以及枚举类型,可以使用在需要int或unsigned int的表达式中。如果int可以完整表示源类型的所有值,那么该源类型的值就转换为int,否则转换为unsigned int。

3、寻常算术转换

  许多操作数类型为算术类型的双目运算符会引发转换,并以类似的方式产生结果类型。它的目的是产生一个普遍类型,同时也是运算结果的类型。

  首先,如果其中一个操作数的类型是long double,那么另一个操作数也会被转换为long double。其次,如果其中一个操作数类型为double,那么另一个操作数也被转换为double。再次,如果其中一个操作数的类型为float,那么另一个操作数也被转换为float。否则,两个操作数进行整形提升,执行下面的规则:如果其中一个操作数类型为unsigned long int,那么另一个操作数也被转换成unsigned long int。其次,如果其中一个操作数的类型是long int,而另一个操作数类型是unsigned int,如果long int能完整表示unsigned int的所有值,那么unsigned int类型操作数被转换为long int,如果long int 不能完整表示unsigned int的所有值,那么两个操作数都被转换为unsigned long int。再次,如果其中一个操作数的类型是long int,那么另一个操作数被转换为long int。再再次,如果其中一个操作数的类型是unsigned int,那么另一个操作数被转换为unsigned int。如果所有以上情况都不属于,那么两个操作数都为int。

  浮点操作数和浮点表达式的值可以用比类型本身所要求的更大的精度和更广的范围表示,而它的类型并不因此改变。

                                                                ——摘自《C专家编程》

时间: 2024-10-26 08:25:51

C语言的整形提升的相关文章

整形提升(C语言基础)续

Conversion rules are more complicated when unsigned operands are involved. The problem is that comparisons between signed and unsigned values are machine-dependent, because they depend on the sizes of the various integer types. For example, suppose t

整形提升(c语言基础)

When you use an arithmetic operator, the operands go through two conversions. Integer promotions: If int can represent all values of the type, then the operand is promoted to int. This applies to both short and unsigned short on most platforms. The c

2.4.5-Java语言基础(类型提升&强制转换)

自动类型转换(也叫隐式类型转换) 强制类型转换(也叫显式类型转换) 类型转换的原理 什么时候要用强制类型转换? 表达式的 数据类型自动提升 ?  所有的byte型.short型和char的值将被提升到int型. ?  如果一个操作数是long型,计算结果就是long型: ?  如果一个操作数是float型,计算结果就是float型: ?  如果一个操作数是double型,计算结果就是double型. 分析 ?  System.out.println('a') 与System.out.printl

C语言之整形溢出

c语言中存在两种整形算术运算,有符号运算与无符号运算.在无符号算数运算中,没有所谓的“溢出”一说:所有的无符号运算都是以2的n次方为模,这里的n是结果中的位数.如果算数运算符的一个操作数是有符号整数,另一个是无符号整数,那么有符号整数会被转换为无符号整数,”溢出“也不可能发生.但是,当两个操作数都是有符号的整数时,”溢出“就有可能发生,而且”溢出的结果是未定义的.当一个运算的结果发生”溢出“是,做出任何假设都是不安全的. 例如,假定a和b是两个非负整形变量,我们需要检查a+b是否会”溢出“.一种

C++语言体系设计哲学的一些随想(未完待续)

对于静态类型语言,其本质目标在于恰当地操作数据,得到期望的值.具体而言,需要: (1)定义数据类型 你定义的数据是什么,是整形还是浮点还是字符.该类型的数据可以包含的值的范围是什么. (2)定义操作的含义 操作是严格数据类型相关的.操作表明了对了一个具有特定类型的数据,执行操作后产生什么样结果. =========================================== C++就是一个典型的静态类型语言.在C++中,无论是"数据类型"还是"操作",都分为

C语言类型转换与原型申明

C语言类型转换与原型申明 关于整型字面值 字面值这个术语是字面常量值的缩写,指定了自身的值,并且不允许发生改变.当有一程序内出现整形字面值时,它是属于整型家庭9种不同类型中的哪一种呢?这取决于如何书写,例如下整型字面值后添加字符L(长整型).U(无符号整型).另外,字符常量(例:'M'.'\377')的类型总是int. 类型转换 c语言中类型转换比一般人想象的要广泛得多.在涉及类型小于int或double的表达式中都可能发生转换.下面程序执行结果是4. printf("%d",size

c语言进阶day_01

数据类型 1.1内存 内存是线性的,按照字节为单位进行编址的(8b) 1.2补码 补码特点(互逆): 0的补码是0 符号位同普通位一起参与运算 补码可以使加减乘除都变成加法 8位数据([-128,127])表示的范围是由补码的编码规则决定的 注意:-1(1111 1111) -128(1000 0000) 127(0111 1111) 1.3数据类型划分 Char  0-128  对应ascii表 为什么需要数据类型? 数据类型提供了申请内存单元的大小和访问规则. 1.4类型转换 1.4.1小数

C语言的基本概念

1.经典入门:hello world 1 #include <stdio.h> 2 3 int main(void) 4 { 5 printf("hello world.\n"); 6 7 return 0; 8 } 注:上面所使用的关键字:include 头文件包含 int 整型,用来表示整数的类型 void 空类型 return 函数返回 2.基本概念: 源文件:源文件即源程序代码文件,C语言源文件后缀名是.c: 头文件:头文件的后缀名为.h,C语言代码由源文件和头文件

1,OC语言的前世今生 ,2,OC语言入门,3,OC语言与C的差异,4,面向对象,5,类和对象的抽象关系,6,类的代码创建,7,类的成员组成及访问

1,OC语言的前世今生 , 一, 在20世纪80年代早期,布莱德.麦克(Brad Cox)设计了OC语言,它在C语言的基础上增加了一层,这意味着对C进行了扩展,从而创造出一门新的程序设计语言,支持对象的创建和操作. 二,1985年,被赶出苹果公司的乔帮主成立了Next公司; 三, 1988年,Next计算机公司获得了OC语言的授权,并发展了OC语言库和一个开发环境,1994年,Next计算机公司(同年更名为Next软件公司)和Sun公司针对NEXTSTEP系统联合发布了一个标准规范,名为OPEN