在c语言中出现的int错误类型,【揭秘】C语言类型转换时发生了什么?

原标题:【揭秘】C语言类型转换时发生了什么?

ID:技术让梦想更伟大

作者:李肖遥

在C语言中,数据类型指的是用于声明不同类型的变量或函数的一个广泛的系统,我们常用的算术类型包括两种类型:整数类型和浮点类型。那么相互之间具体是怎么转化的呢?

了解一下类型转换

不同数据类型的存储大小和值范围是不一样的,程序在初始化的时候就已经设定了,例如:

int a = 9;

floatb = 8.5;

a,b占的字节大小不一样,这个我们应该都知道,在C语言中一个表达式允许不同类型的数据进行运算,例如:

int a = 9;

floatb = 8.5,c;

c = a + b;

因为计算机硬件在进行算术操作时,要求各操作数的类型具有相同的存储位数以及一样的存储方式,所以就出现了类型转换。

对于某些类型的转换,编译器可以隐式地自动进行,这种转换称为 自动类型转换;

而有些类型转换需要程序员显式指明,那么通常把这种转换称为 强制类型转换。

自动类型转换

自动转换是在源类型和目标类型兼容以及目标类型广于源类型时发生一个类型到另一类的转换。我们先来看一段代码

//vs2019

//来源:技术让梦想更伟大

//作者:李肖遥

#include

int main

{

//定义一个整型指针变量pPoint

int* pPoint;

//定义基本的数据的类型

char c;

short s;

int i;

long l;

floatf;

double d;

//将整型浮点型数据赋值给指针类型

pPoint = c;

pPoint = s;

pPoint = i;

pPoint = l;

pPoint = f;

pPoint = d;

return0;

}

由于指针变量和整型、浮点这些数据型的类型是不能相互赋值的,编译报错输出:

8cc4e13038a2e071721632a15906103d.png

那么我们把同类型数据类型进行运算后赋值呢?

//vs2019

//来源:技术让梦想更伟大

//作者:李肖遥

#include

int main

{

//定义一个整型指针变量pPoint

int* pPoint;

//定义基本的数据的类型

char c;

short s;

int i;

long l;

floatf;

double d;

//将整型浮点型数据运算之后赋值给指针类型

pPoint = c + c;

pPoint = s + s;

pPoint = i + i;

pPoint = l + l;

pPoint = f + f;

pPoint = d + d;

return0;

}

char同类型运算,结果是一个int类型。

short同类型运算,结果是一个int类型。

int同类型运算,结果是一个int类型。

long同类型运算,结果是一个long类型。

float同类型运算,结果是一个float类型。

double同类型运算,结果是一个double类型。

如下图所示:

e894eba057b04e4740a1351a1403cfb0.png

同类型运算中:

整型:比int小的,都会转换成int,比int大的不变。

浮点:不变。

那么我们把不同类型数据类型进行 运算后赋值呢?

//vs2019

//来源:技术让梦想更伟大

//作者:李肖遥

#include

int main

{

//定义一个整型指针变量pPoint

int* pPoint;

//定义基本的数据的类型

char c;

short s;

int i;

long l;

floatf;

double d;

//将整型浮点型数据混合运算赋值给指针类型

pPoint = c + s; // char + short = int

pPoint = c + i; // char + int = int

pPoint = c + l; // char + long = int

pPoint = c + f; // char + float= long

pPoint = c + d; // char + double = float

return0;

}

char类型与short类型运算,结果是一个int类型。

char类型与int类型运算,结果是一个int类型。

char类型与long类型运算,结果是一个long类型。

char类型与float类型运算,结果是一个float类型。

char类型与double类型运算,结果是一个double类型。

结果如下图所示:

27d0550ea1ff0b4fc18cd7c88afdf10f.png

可以得出在不同类型运算中:

如果两边均比int小或等于int,那么结果为int。

如果两边有比int大的,那么结果为比int大的类型。

我们得到结论如图:

b6ed952be3462fff84ac908f627b4a0e.png

整型类型级别从低到高依次为:

int -> unsigned int -> long -> unsigned long -> long long -> unsigned long long

浮点型级别从低到高依次为:

float -> double

自动转换规则:

图中 横向箭头表示必须的转换,如两个float型数参加运算,虽然它们类型相同,但仍要先转成double型再进行运算,结果亦为double型。

图中 纵向箭头表示当运算符两边的运算数为不同类型时的转换,如一个long 型数据与一个int型数据一起运算,需要先将int型数据转换为long型, 然后两者再进行运算,结果为long型。

当较高类型的数据转换为较低类型时,则可能有些数据丢失。

当 较低类型的数据转换为较高类型时,一般只是形式上有所改变, 而不影响数据的实质内容。

所有这些转换都是由系统自动进行的,使用时你只需从中了解结果的类型即可。

强制类型转换

强制类型转换是通过类型转换运算来实现的。其一般形式为:

(类型说明符) (表达式)

其作用就是把表达式的运算结果强制转换成类型说明符所表示的类型的值。

//vs2019

//来源:技术让梦想更伟大

//作者:李肖遥

#include

#include

int main

{

floatf,x=1.3,y=1.4;

int i = 4,a,b;

a = x + y;

b = (int)(x+y);

f = 10/i;

printf( "a=%d,b=%d,f=%f,x=%f,y=%fn",a,b,f,x,y);

}

运行结果如下:

fce63e1baf81c430ee1cee6bb8699560.png

914e8c991419cea56c3fd3908b8c1318.png

我们从中可以看到,虽然x,y变强制转换int型,但是最后输出的值不变,强制类型转换没有影响x和y变量原本的类型。而上图警告已经说明了一切。

注意:在C语言中,对一个变量赋值的时候,这个变量初始定义的类型包含了两层含义:

这个数据类型表示的内存空间的大小。

编译器把设定的数值放到这个内存空间,是数据类型的存储方式解析后存进去的。总结强调一点

进行强制类型转换后,内存空间里面的内容是不会发生改变的,改变的是运算时的临时数据对象的类型,是你去读取这个内存空间时的解析方法。所以,一定要对这个数据类型的内存空间和解析方式有一个清晰的认知。

●C 语言漏洞最严重,PHP 最易受攻击,程序员该怎么写代码?返回搜狐,查看更多

责任编辑:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值