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

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

了解一下类型转换

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

int a = 9;

floatb = 8.5;

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

int a = 9;

floatb = 8.5,c;

c = a + b;

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

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

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

自动类型转换

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

#include <stdio.h>

intmain()

{

//定义一个整型指针变量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;

}

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

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

#include <stdio.h>

intmain()

{

//定义一个整型指针变量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类型。

如下图所示:

同类型运算中:

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

浮点:不变。

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

#include <stdio.h>

intmain()

{

//定义一个整型指针变量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类型。

结果如下图所示:

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

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

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

我们得到结论如图:

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

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

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

float -> double

自动转换规则:

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

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

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

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

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

强制类型转换

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

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

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

#include<stdio.h>

#include<string.h>

intmain()

{

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=%f\n",a,b,f,x,y);

}

运行结果如下:


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

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

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

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

总结强调一点

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

C/C++学-习-交-流-裙  10+830+20+561

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,968评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,601评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,220评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,416评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,425评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,144评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,432评论 3 401
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,088评论 0 261
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,586评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,028评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,137评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,783评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,343评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,333评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,559评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,595评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,901评论 2 345