-
2016-04-26 11:17:02
C语言隐式类型转换的规则
隐式类型转换规则:
1.如果一个操作数的类型是long double ,就把另一个操作数转换为long double 类型;
2.否则,如果一个操作数的类型是double,就把另一个操作数转换为double类型;
3.否则,如果一个操作数是float,就把另一个操作数转换为float类型;
4.否则,如果两个操作数的类型都是带符号的整数或无符号的整数,就把级别较低的操作数转换为另一个操作数的类型.
无符号整数类型的级别从低到高为:usigned char,shrot,int,long,long long
有符号整数类型的级别与对应的无符号整数类型级别一致;
5.否则,如果带符号整数类型的操作数级别低于无符号整数类型的级别,就把带符号整数类型的操作数转换为无符号整数类型;
6.否则,如果带符号整数类型的值域包含了无符号整数类型所表示的值,就把无符号整数类型转换为带符号整数类型;
7,否则,两个操作数都转换为带符号整数类型对应的无符号整数类型;摘抄自《C语言入门经典》第五版 56页
更多相关内容 -
C语言隐式类型转换规则_(比较实用).pdf
2020-08-19 07:53:28C 语言隐式类型转换规则 C语言规定,不同类型的数据需要转换成同一类型后才可进行计算,在整型实型和字符型数据之间通过类型 转换便可以进行混合运算(但不是所有类型之间都可以进行转换) .当混合不同类型的变量进行... -
C语言隐式类型转换规则
2011-10-12 14:35:26C语言隐式类型转换规则。了解一下对写程序有好处,可以防止不必要的错误 -
C语言隐式类型转换
2018-10-11 19:16:58C语言隐式类型转换 算术运算式中,低类型转换为高类型 赋值表达式中,表达式的值转换为左边变量的类型 函数调用时,实参转换为形参的类型 函数返回值,return表达式转换为返回值类型 对于上面的隐式类型...C语言隐式类型转换
算术运算式中,低类型转换为高类型
赋值表达式中,表达式的值转换为左边变量的类型
函数调用时,实参转换为形参的类型
函数返回值,return表达式转换为返回值类型
对于上面的隐式类型转换规则,绝大多数学c语言或者说学编程的人都知道。
那下面我们看一个有趣的例子吧:#include <stdio.h> int main() { int i = -2; unsigned int j = 1; if( (i + j) >= 0 ) { printf("i+j>=0\n"); } else { printf("i+j<0\n"); } printf("i+j=%d\n", i + j); return 0; }
你觉得会有怎么样的输出呢,大家肯定会觉得简单啊。那先看一下运行结果吧:
看着上面的规则,对着输出,有点懵了,还能有这样的操作嘛?
来分析一下,在计算时,转换为高类型,即unsigned int,判断>0,这里感觉没有错。
那为什么输出-1,跟我们正常算-2+1的结果一样呢。我们都知道计算机是补码存储,-2+1的unsigned int结果是0xffffffff,对于输出的%d其实是int类型,所以自然打印就是-1了。 -
C语言隐式类型转换的一个小坑
2020-12-22 19:13:19这个问题大致是这样的,本来试图写一个产生低8位为1的掩码的语句: uint32_t mask = ~((uint8_t)0); ,结果发现算出的掩码是 0xffffffff 显然不符合预期,于是折腾检查了一番,写出对比程序如下: ... -
【转】C语言隐式类型转换规则
2021-05-19 13:58:37C语言规定,不一样类型的数据须要转换成同一类型后才可进行计算,在整型、实型和字符型数据之间经过类型转换即可以进行混合运算(但不是全部类型之间均可以进行转换)ide.当混合不一样类型的变量进行计算时,即可能会...C语言规定,不一样类型的数据须要转换成同一类型后才可进行计算,在整型、实型和字符型数据之间经过类型转换即可以进行混合运算(但不是全部类型之间均可以进行转换)ide
.当混合不一样类型的变量进行计算时,即可能会发生类型转换函数
相同类型的数据在转换时有规则可循:对象
字符必须先转换为整数(C语言规定字符类型数据和整型数据之间能够通用)get
short型转换为int型(同属于整型)编译器
float型数据在运算时一概转换为双精度(double)型,以提升运算精度(同属于实型)博客
赋值时,一概是右部值转换为左部类型it
[注]io
当整型数据和双精度数据进行运算时,C先将整型数据转换成双精度型数据,再进行运算,结果为双精度类型数据编译
当字符型数据和实型数据进行运算时,C先将字符型数据转换成实型数据,而后进行计算,结果为实型数据class
2.4 数据类型转换在C语言的表达式中,准许对不一样类型的数值型数据进行某一操做或混合运算。当不一样类型的数据进行操做时,应当首先将其转换成相同的数据类型,而后进行操做。数据类型转换有两种形式,即隐式类型转换和显示类型转换。
2.4.1 隐式类型转换所谓隐式类型转换就是在编译时由编译程序按照必定规则自动完成,而不需人为干预。所以,在表达式中若是有不一样类型的数据参与同一运算时,编译器就在编译时自动按照规定的规则将其转换为相同的数据类型。
C语言规定的转换规则是由低级向高级转换。例如,若是一个操做符带有两个类型不一样的操做数时,那么在操做以前行先将较低的类型转换为较高的类型,而后进行运算,运算结果是较高的类型。更确切地说,对于每个算术运算符,则遵循图2-2所示的规则。
图2-2 数据类型转换规则之一
注意:在表达式中,全部的float类型都转换为double型以提升运算精度。
在赋值语句中,若是赋值号左右两端的类型不一样,则将赋值号右边的值转换为赋值号左边的类型,其结果类型仍是左边类型。
由于函数参数是表达式,所以,当参数传递给函数时,也发生类型转换。具体地说,char和short均转换为int;float转换为double。这就是为何咱们把函数参数说明为int和double,尽管调用函数时用char和float .
也能够将图2-2所示的规则用图2-3表示。图2-3中的水平箭头表示一定转换,纵向箭头表示两个操做对象类型不一样时的转换方向。
图2-3 数据类型转换规则之二
下面举行说明类型转换的规则。例如执行:
x=100+'a'+1.5 * u+f/'b'-s * 3.1415926
其中,u为unsigned型,f为float型,s为short型,x为float型。式中右面表达式按以下步骤处理:
(1)首先将'a'、'b'和s换成int,将1.5和f转换为double型。
(2)计算100+'a',因'a'已转换为int型,因而此运算结果为197。
(3)计算1.5*u,因为1.5已转换为double,u是unsigned型,因而首先u转换为double,而后进行运算,运算结果为double。
(4)计算197+1.5 * u,先将197转换为double(如197.00…00),其结果为double。
(5)计算f/ 'b',f已转换为double,'b'已转换为int,因而先将'b'再转换为double,其结果为double。
(6)计算(197+1.5 * u)+f / 'b',者均为double,因而结果也为double。
(7)计算s * 3.1415926,先将s由int转换为double,而后进行运算,其结果为double。
(8)最后与前面得的结果相减,结果为double。
(9)最后将表达式的结果转换为float并赋给x。
。
。
。
。
先看程序:
#include
#include
int main(int argc, char**argv){
unsigned int right = 1;
char left = -1;
if(left < right)printf("%d < %d\n", left, right);
else if(left == right)printf("%d = %d\n", left, right);
else printf("%d > %d\n", left, right);
system("PAUSE");
return 0;
}
运行结果是:-1 > 1
解释:按步骤进行.
1. 若是其中一个操做数为long double类型,则另外一个操做数被转换为long double.
2. 不然,若是其中一个操做数为double, 则另外一个操做数被转换为double.
3. 不然,若是其中一个操做数为float, 则另外一个操做数也转换为float.
4. 不然,两个操做数进行 "整型升级":
a. 若是其中一个操做数为unsigned long int, 则另外一个操做数也被视为unsigned long int.
b. 不然,若是其中一个操做数为long int,而另外一个操做数类型是unsigned int, 而且long int可以表示unsigned int的全部值,则另外一个操做数也被视为long int;若是long int不能表示unsigned int的全部值,则两个数都被视为unsigned long int.
c. 不然, 若是其中一个操做数是long int,则另外一个操做数也被视为long int.
d. 不然, 若是其中一个操做数是unsigned int, 则另外一个操做数也被视为unsigned int.
e. 不然, 两个操做数都被视为int.
-
关于C语言的隐式类型转换规则
2021-11-13 15:58:29基于C89标准下的隐式类型转换规则: 1.算术运算中或者逻辑判断表达式中操作式,不匹配的时候 2.赋值时,如果左右操作数类型不匹配 3.函数传递进去的实参和匹配的形参对应不上 4.函数返回的表达式的类型和函数返回...基于C89标准下的隐式类型转换规则:
1.算术运算中或者逻辑判断表达式中操作式,不匹配的时候
2.赋值时,如果左右操作数类型不匹配
3.函数传递进去的实参和匹配的形参对应不上
4.函数返回的表达式的类型和函数返回类型不匹配
整值提升:将出现的字符类型(char)和短整型(short)统一提升为int类型(特殊情况下,也会提升为unsigned int)
1.如果左右操作数中存在浮点值
1.1如果一个操作数是long double,另一个操作数自动转换为long double
1.2如果一个操作数是double,另一个操作数自动转换为double
1.3如果一个操作数是float,另一个操作数自动转换为float
浮点值的优先级 long double > double > float
这一块操作数,浮点值和整形值混用
2.如果左右操作数中不存在浮点值
2.1首先整治提升(不要存在字符类型和短整型)
2.2 int < unsigned int < long < unsigned long
2.3特殊:如果两个操作数大小相等,并且一个是unsigned int,另一个是long int,则两个全部转换为unsigned long int赋值语句:
左值大小 >= 右值大小 则自动转换
需要注意的点:
1.如果左边操作数类型 存储不下 右边操作数的值,则很危险
2.浮点值默认double,如果定义float a = 3.14; 会触发double转换为float,数据阶段
3.将浮点值赋值给整形值,会发生数据丢失(丢失小数点之后的数据)案例测试:
#include <stdio.h> #include <typeinfo> int main() { char c; short s; unsigned short us;//unsigned short int us; int i; unsigned int ui; long l; unsigned long ul; float f; double d; long double ld; printf("%d\n", sizeof(c+s));//int printf("%s\n", typeid(c+s).name());//int printf("%s\n", typeid(c+us).name());//int printf("%s\n", typeid(s+us).name());//int printf("%s\n", typeid(us+i).name());//int printf("%s\n", typeid(i+ui).name());//ui printf("%s\n", typeid(i+l).name());//l printf("%s\n", typeid(ui+l).name());//unsigned long int printf("%s\n", typeid(l+ul).name());//ul printf("%s\n", typeid(f+s).name());//f printf("%s\n", typeid(f+c).name());//f printf("%s\n", typeid(f+i).name());//f printf("%s\n", typeid(d+ui).name());//d printf("%s\n", typeid(d+l).name());//d printf("%s\n", typeid(ld+s).name());//ld printf("%s\n", typeid(ld+i).name());//ld return 0; }
C99,相较于C89,多了一些数据类型(bool long long int, 复数类型)大体规则不变
C99将所有整型类型分等级:从高到低
1: long long int unsigned long long int
2: long int unsigned long int
3: int unsigned int
4: short int unsigned short int
5: char unsigned char signed char
6: bool使用的时候,具体分两种情况:
1.操作数中带浮点值,和C89一致
2.操作数中如果不带浮点值:(4个条件,从上到下触发,触发其中一个则退出)
2.1: 如果两个操作数都是有符号类型或者都是无符号类型,小的向大的转化
2.2: 如果无符号操作数类型 >= 有符号操作数类型,则有符号向无符号操作数转换
2.3: 如果有符号操作数类型 > 无符号操作数类型,如果无符号操作数能表示的范围可以用有符号去表示,则无符号想有符号操作数转化
2.4: 两个同时向有符号类型的无符号类型转化
特殊:如果两个操作数大小相等,并且一个是unsigned int,另一个是long int,则两个全部转换为unsigned long int
3.所有的类型都可以转化bool类型,如果值为0转化为false 要不然则为true
强制类型转化:
(类型)表达式:类型->强行将表达式结果转化的数据类型
float = (float)3.14;
int a = (int)3.14;
这里的括号,一般看做单目运算符,优先级最高关于隐式转换的一些题目
计算程序运行结果
1.
#include <stdio.h> #define FUNC(x,y)(x>y)?'a':'b' int main() { unsigned int a = 10; char b = 1; unsigned char c = -1; printf("%c,%c\n", FUNC(a, b), FUNC(a, c)); return 0; }
2.
int main() { int a = 10; unsigned char b = -10; unsigned int c = 10; printf("%d\n", a + b); return 0; }
答案:
1. a,b 2. 256
第一个题unsigned char 类型取值范围是0-255,由于-1存储的补码为“11111111”,因此被转化成了255
第二题 不同类型进行比较,根据隐式类型转化规则unsigned char 被转化为unsigned int 因此-10也就变成了246
-
C语言 - 隐式类型转换
2021-05-11 21:28:04C语言的整型算术运算总是至少以缺省整型类型的精度来进行的。为了获得这个精度,表达式中的字符和短整型操作数在使用之前被转换为普通整型,这种转换称为整型提升。 比如: char a, b, c; … a = b + c; 将b和c的值... -
关于C语言的隐式类型转换
2021-05-21 06:17:14同种数据类型的变量在进行运算的时候,我们都知道怎么去运算比如int a = 5, b = 10;...这就牵扯到了我们所说的隐式类型转换啦,我们先来看一副图:从上图中,我们可以看到,float类型转换成了d... -
C语言隐式转换的陷阱
2022-04-13 21:40:39C语言隐式转换的陷阱 当使用unsigned类型和signed类型进行运算时,有符号的类型会自动转换为unsigned,这在进行条件判断的时候结果会让人匪夷所思。 比如下面的例子: int main(void) { unsigned int size = 10; ... -
C语言隐式类型转换和整型提升
2020-07-03 10:14:08C语言隐式类型转换 算术运算式中,低类型转换为高类型 赋值表达式中,表达式的值转换为左边变量的类型 函数调用时,实参转换为形参的类型 函数返回值,return表达式转换为返回值类型 对于上面的隐式类型转换... -
C语言隐式类型转换规则_(比较实用).doc
2021-05-25 03:38:58C语言隐式类型转换规则_(比较实用).docC语言隐式类型转换规则C语言规定,不同类型的数据需要转换成同一类型后才可进行计算,在整型、实型和字符型数据之间通过类型转换便可以进行混合运算(但不是所有类型之间都可以... -
C语言隐式类型转换(整型提升)
2022-03-19 15:31:40了解C语言整型提升的过程 -
C++类型转换:隐式类型转换、类类型转换、显示类型转换
2021-05-23 00:43:49C++语言是一种强类型语言,当...1. 隐式类型转换在有隐式类型转换的表达式中,使用者不需要明确指定一个类型的对象该转换为另外哪一个类型,这个工作将隐含地由编译器来完成,编译器将分析表达式的含义,进行类型... -
c语言隐式类型转换——小心!
2018-12-24 21:24:50今天查一个和RTP协议有关的bug,代码不是我写的,...最后基本确定是隐式类型转换的问题,不需要做什么大的改动。 因为是前人写的代码,理解和修改都得小心翼翼,怕改了引发新的bug。 错误代码: if ((packe... -
C语言隐式类型转换规则
2010-06-02 13:47:00C语言隐式类型转换规则C语言规定,不同类型的数据需要转换成同一类型后才可进行计算,在整型、实型和字符型数据之间通过类型转换便可以进行混合运算(但不是所有类型之间都可以进行转换) <br />.... -
c语言隐式类型转换
2016-10-01 18:50:50隐式类型转换分三种,即算术转换、赋值转换和输出转换。 1.算术转换 进行算术运算(加、减、乘、除、取余以及符号运算)时,不同类型数招必须转换成同 一类型的数据才能运算,算术转换原则为: 整型... -
C语言隐式类型转换顺序
2021-11-06 17:49:28 -
C语言中的数据类型的隐式转换
2021-07-25 22:51:592、赋值表达式中,右边表达式的值自动隐式转换为左边变量的类型,并赋值给他。 3、函数调用中参数传递时,系统隐式地将实参转换为形参的类型后,赋给形参。 4、函数有返回值时,系统将隐式地将返回表达式类型转换为... -
C语言:隐式转换
2020-05-26 18:47:361.隐式转换图 无条件转换:float ==> double和short/char ==> int 类型提升:int ==> long ==> unsigned ==> double 2.例题 int a = 1; unsigned char b = -1; char rt = a > b ? 'a' : 'b' ... -
C 隐式类型转换是什么?
2021-10-16 00:42:39C 隐式类类型转换《C Primer》中提到:“可以用 单个形参来调用 的构造函数定义了从 形参类型 到 该类类型 的一个隐式转换。”这里应该注意的是, “可以用单个形参进行调用”...