4.2 C语言中的强制类型转换(精选多篇)

时间:2019-05-14 08:43:23下载本文作者:会员上传
简介:写写帮文库小编为你整理了多篇相关的《4.2 C语言中的强制类型转换》,但愿对你工作学习有帮助,当然你在写写帮文库还可以找到更多《4.2 C语言中的强制类型转换》。

第一篇:4.2 C语言中的强制类型转换

一、自动类型转换

● 字符型变量的值实质上是一个8位的整数值,因此取值范围一般是-128~127,char型变量也可以加修饰符unsigned,则unsigned char 型变量的取值范围是0~255(有些机器把char型当做unsighed char型对待,取值范围总是0~255)。● 如果一个运算符两边的运算数类型不同,先要将其转换为相同的类型,即较低类型转换为较高类型,然后再参加运算,转换规则如下图所示。double ←── float 高 ↑ long ↑ unsigned ↑

int ←── char,short 低

● 图中横向箭头表示必须的转换,如两个float型数参加运算,虽然它们类型相同,但仍要先转成double型再进行运算,结果亦为double型。纵向箭头表示当运算符两边的运算数为不同类型时的转换,如一个long 型数据与一个int型数据一起运算,需要先将int型数据转换为long型,然后两者再进行运算,结果为long型。所有这些转换都是由系统自动进行的,使用时你只需从中了解结果的类型即可。这些转换可以说是自动的,但然,C语言也提供了以显式的形式强制转换类型的机制。● 当较低类型的数据转换为较高类型时,一般只是形式上有所改变,而不影响数据的实质内容,而较高类型的数据转换为较低类型时则可能有些数据丢失。

二、赋值中的类型转换

当赋值运算符两边的运算对象类型不同时,将要发生类型转换,转换的规则是:把赋值运算符右侧表达式的类型转换为左侧变量的类型。具体的转换如下:(1)浮点型与整型

● 将浮点数(单双精度)转换为整数时,将舍弃浮点数的小数部分,只保留整数部分。

将整型值赋给浮点型变量,数值不变,只将形式改为浮点形式,即小数点后带若干个0。注意:赋值时的类型转换实际上是强制的。(2)单、双精度浮点型

● 由于C语言中的浮点值总是用双精度表示的,所以float 型数据只是在尾部加0延长为doub1e型数据参加运算,然后直接赋值。doub1e型数据转换为float型时,通过截尾数来实现,截断前要进行四舍五入操作。

(3)char型与int型

● int型数值赋给char型变量时,只保留其最低8位,高位部分舍弃。

● chr型数值赋给int型变量时,一些编译程序不管其值大小都作正数处理,而另一些编译程序在转换时,若char型数据值大于127,就作为负数处理。对于使用者来讲,如果原来char型 数据取正值,转换后仍为正值;如果原来char型值可正可负,则转换后也仍然保持原值,只是数据的内部表示形式有所不同。

(4)int型与1ong型

● long型数据赋给int型变量时,将低16位值送给int型变量,而将高16 位截断舍弃。(这里假定int型

占两个字节)。

将int型数据送给long型变量时,其外部值保持不变,而内部形式有所改变。

(5)无符号整数

● 将一个unsigned型数据赋给一个占据同样长度存储单元的整型变量时(如:unsigned→int、unsigned long→long,unsigned short→short),原值照赋,内部的存储方式不变,但外部值却可能改变。● 将一个非unsigned整型数据赋给长度相同的unsigned型变量时,内部存储形式不变,但外部表示时总是无符号的。

/*例:赋值运算符举例 */ main(){ unsigned a,b;

int i,j;

a=65535;

i=-1;

j=a;

b=i;

printf(“(unsigned)%u→(int)%dn”,a,j);

printf(“(int)%d→(unsigned)%un”,i,b);}

运行结果为:

(unsigned)65535→(int)-1(int)-1→(unsigned)65535

● 计算机中数据用补码表示,int型量最高位是符号位,为1时表示负值,为0时表示正值。如果一个无符号数的值小于32768则最高位为0,赋给 int型变量后、得到正值。如果无符号数大于等于32768,则最高位为1,赋给整型变量后就得到一个负整数值。反之,当一个负整数赋给unsigned 型变量时,得到的无符号值是一个大于32768的值。

● C语言这种赋值时的类型转换形式可能会使人感到不精密和不严格,因为不管表达式的值怎样,系统都自动将其转为赋值运算符左部变量的类型。

● 而转变后数据可能有所不同,在不加注意时就可能带来错误。这确实是个缺点,也遭到许多人们批评。但不应忘记的是:c面言最初是为了替代汇编语言而设计的,所以类型变换比较随意。当然,用强制类型转换是一个好习惯,这样,至少从程序上可以看出想干什么。

==

在C语言中,不同数据类型的运算对象进行混合运算,或者需要将一个表达式的结果转换成期望的类型时,就需要依据数据类型转换规则进行转换。具体有以下几种情况:

2.8.1各类数值型数据间混合运算时的类型转换规则

整型、实型、字符型数据间可以混合运算。在这种情况下,需要将不一致的数据类型转

换成一致的数据类型,然后进行运算。为了保证运算精度,系统在运算时的转换规则是将存储长度较短的运算对象转换成存储长度较长的类型,然后再进行处理。这种转换是系统自动进行的,具体如图2-9所示。

double ←── float 高 ↑ long ↑ unsigned ↑

int ←── char,short 低

对图2-9的说明如下:

1)纵向箭头表示必定会进行的转换,如float型数据必先转换为double型数据,然后与其他操作数进行运算。与此类似,char型或short型数据必先转换为int型数据,然后进行运算。

2)横向箭头表示当运算对象为不同类型数据时的转换方向,如int型数据与unsigned型数据进行运算,int型转换为unsigned型后方可进行运 算。int型数据与double型数据进行运算,int型直接转换为double型后进行运算,不能理解为先转换为unsigned int型,然后转换为long int型,最后再转换为double型。

2.8.2 赋值时的类型转换

当赋值运算符两侧的类型不同时,需进行类型转换,这种转换也是系统自动进行的。具体转换原则如下:

1)float、double型赋值给int型:直接截断小数。

例如:int i=f+0.6;f的值4.0,右边算术表达式运算后的结果为一个值为4.6的double型数据,根据上述转换原则,直接舍弃小数,所以i的值为4。2)int、char型赋值给float、double型:补足有效位以进行数据类型转换。

例如:float f=4;float为7位有效数字,所以f的值为4.000000。3)char型(1字节)赋值给int型(2字节):数值赋给int的低8位,高8位补0。

4)long int型赋值给int型:long int截断低字节给int型。

5)int 型赋值给long int:赋给long int的低16位,如果int的最高位是0,则long int的高16位全为0;如果int的最高位是1,则long int的高8位全为1(称为“符号扩展”)。

6)unsigned int型赋值给int型:直接传送数值。

7)非unsigned数据型赋值给位数相同的unsigned 数据:直接传送数值。

2.8.3 强制类型转换

除了以上的两种自动类型转换外,在C语言中,允许强制类型转换,将某一数据的数据类型转换为指定的另一种数据类型。强制转换是用强制转换运算符进行的,强制转换运算符为:(类型名),强制转换运算符组成的运算表达式的一般形式为:

(类型名)(表达式)例如:

(int)(x + y)//将x+y的值转换成整型,即取整数部分。(float)x + y //将x转换成单精度型。

强制转换运算符优先级比算术运算符高。同表达式中数据类型的自动转换一样,强制类型转换也是临时转换,对原运算对象的类型没有影响。

例如,已知有变量定义:int b=7;float a=2.5,c=4.7;求下面算术表达式的值。

a+(int)(b/3*(int)(a+c)/2.0)%4;

根据运算符结合性规则,上述表达式要自左之右执行,b/3为2,2*int(a+c)为14,14/2.0为7.0,强制类型转换后为7,7%4为3;a的值2.5与3相加,最终结果为5.5。

第二篇:c语言中swap问题小结

#include #include void swap1(int x,int y){ int temp;temp=x;x=y;y=temp;} void swap2(int *x,int *y){ int *temp;temp=x;x=y;y=temp;} void swap3(int *x,int *y){ int temp;temp=*x;*x=*y;*y=temp;} void swap4(int a[],int b[]){ int temp;temp=a[0];a[0]=b[0];b[0]=temp;} void swap5(int a[],int b[]){ int temp;temp=*a;*a=*b;*b=temp;} int main(){ int x,y;x=4;y=3;swap1(x,y);

printf(“swap1: x:%d,y:%dn”,x,y);//形参传值,不能交换,实际传过去是拷贝的一份,没改变主函数中x,y swap2(&x,&y);

printf(“swap2: x:%d,y:%dn”,x,y);//不能交换,函数中只是地址交换了下,地址指向的内容没有交换 swap3(&x,&y);

printf(“swap3: x:%d,y:%dn”,x,y);//能交换,地址指向的内容进行了交换 swap4(&x,&y);

printf(“swap4: x:%d,y:%dn”,x,y);//能交换,地址指向的内容进行交换 swap5(&x,&y);

printf(“swap5: x:%d,y:%dn”,x,y);//能交换,地址指向的内容进行交换 return 0;} swap1: x:4,y:3 swap2: x:4,y:3 swap3: x:3,y:4 swap4: x:4,y:3 swap5: x:3,y:4

第三篇:C语言中的文本Txt操作

对于文件使用方式有以下几点说明:

1)文件使用方式由r,w,a,t,b,+六个字符拼成,各字符的含义是:

r(read):

w(write):

+:

读和写

a(append):

追加

t(text):

文本文件,可省略不写

b(banary):

二进制文件

2)用“r”打开一个文件时,该文件必须已经存在,且只能从该文件读出。

3)用“w”打开的文件只能向该文件写入。若打开的文件不存在,则以指定的文件名建立该文件,若打开的文件已经存在,则将该文件删去,重建一个新文件。

4)若要向一个已存在的文件追加新的信息,只能用“a”方式打开文件。但此时该文件必须是存在的,否则将会出错。

5)在打开一个文件时,如果出错,fopen将返回一个空指针值NULL。在程序中可以用这一信息来判别是否完成打开文件的工作,并作相应的处理。

将一个txt文本里的数排序再输出到另一个文本里

#include“stdio.h” #include“stdlib.h” main(){

FILE *p1,*p2;int a[10],i,j,temp;if((p1=fopen(“E:in.txt”,“r”))==NULL)

{

printf(“cannot open filen”);

exit(0);} if((p2=fopen(“E:out.txt”,“w”))==NULL){

printf(“cannot open filen”);

exit(0);} for(i=0;i<10;i++)fscanf(p1,“%d”,&a[i]);for(i=0;i<10;i++){

for(j=0;j<10-i;j++)

if(a[j]>a[j+1])

temp=a[j+1];

a[j+1]=a[j];

a[j]=temp;}

for(i=0;i<10;i++)fprintf(p2,“%d”,a[i]);}

第四篇:C语言中union应用总结

C语言中union应用总结

定义共用体的类型变量的一般形式为: union 共用体名 {

成员列表; }变量列表; 例如: union data {

int i;

unsigned char c[4];

float f;};union data a;//定义union类型的变量

共用体变量a中的成员i、c、f三个变量在内存中从同一个地址开始存储,即在同一个内存中可以用来存放几种不同类型的数据;共用体变量a所占内存的长度等于最长成员的长度,这里c[4]和f的长度都为4字节。例如进行如下赋值: a.i = 100;a.f = 100.5;那么此时共用体变量a中的成员i已经没有值了,因为存储该值的内存现在已经被用来存储成员f的值了。共用体成员间是共享内存的,对共用体的一个成员赋值,其他成员的值跟着发生变化。利用共用体成员间是共享内存的这一特性,有以下几种应用:

1、在需要将浮点数据转移时,使用共同体,按4个字节的char型数据传输,带来通信效率的提高。一般浮点数发送方法:是将浮点数放大一定的倍数,再取整,再按整数的高低位传输。还需要传输这个放大的倍数,如果浮点数是个负数的话,还要将符号位一并发送。接收方收到这几条报文后,才能将数据还原。但是接收方还原的浮点数据与发送方发送的浮点数不一样,因为小数位数发生变化。使用共同体就不会出现这个问题了,在 接收方,使用共同体,将收到到的4个char数据赋值给a.c数组,a.f就是还原的数据,这个数据和发送的数据是一样的,也不管发送的浮点数是正还是负。如有a.f =-12.34;则a.c[0] = 0xa4, a.c[1] = 0x70, a.c[2] = 0x45, a.c[3] = 0xc1。如有a.c[0] = 0xa4, a.c[1] = 0x70, a.c[2] = 0x45, a.c[3] = 0xc1,则a.f =-12.34。使用这种方式传输浮点数,数据是不会丢失的,报文也更简单。

2、将浮点数保存到文件中时,保存为4个字节的char型数据,节约空间。如果保存为文本需要占用的字节数等于数值的字符的个数,有可能占用1~20字节,而用共用体的char型数据,占用的空间大小固定为4字节,对大量浮点数据的存储,节约的空间更多,分析保存的浮点数也是很方便的。

3、用在强制类型转换上。如将int数据转为float,可以这样使用union: a.i =1234;赋值后,a.f就是转换后的值等于1234。

第五篇:C语言中的EOF

C语言中的EOF EOF是指文件的结束符,是一个宏定义.对于键盘输入来说,getchar()只有在遇到文本结束标记(ASCII编码为26)时才会返回EOF,其它情况都会返回一个输入符号值。所以对于这种程序,要想让循环信息运行,只能输入这个文本结束标记。输入这个标记有多种方法,常用的就是按F6键,或者按Ctrl-Z组合键,或者打开数字小键盘之后按住Alt键再依次按小键盘上的26两个数字键最后放开Alt键,等,都可以输入这个文本结束标记。

借助于getchar 与putchar 函数,可以在不了解其它输入/输出知识的情况下编写出数量惊人的有用的代码。最简单的例子就是把输入一次一个字符地复制到输出,其基本思想如下: 读一个字符

while(该字符不是文件结束指示符)输出刚读入的字符 读下一个字符

将上述基本思想转换为C语言程序为: #include /* copy input to output;1st version */ main(){ int c;c = getchar();while(c!= EOF){ putchar(c);c = getchar();} } 其中,关系运算符!=表示“不等于”。

字符在键盘、屏幕或其它的任何地方无论以什么形式表现,它在机器内部都是以位模式存储的。char 类型专门用于存储这种字符型数据,当然任何整型(int)也可以用于存储字符型数据。因为某些潜在的重要原因,我们在此使用int类型。

这里需要解决如何区分文件中有效数据与输入结束符的问题。C语言采取的解决方法是:

在没有输入时,getchar 函数将返回一个特殊值,这个特殊值与任何实际字符都不同。这个值称为EOF(end of file,文件结束)。我们在声明变量c 的时候,必须让它大到足以存放getchar函数返回的任何值。这里之所以不把c声明成char类型,是因为它必须足够大,除了能存储任何可能的字符外还要能存储文件结束符EOF。因此,我们将c声明成int类型。

EOF 定义在头文件中,是个整型数,其具体数值是什么并不重要,只要它与任何char类型的值都不相同即可。这里使用符号常量,可以确保程序不需要依赖于其对应的任何特定的数值。

对于经验比较丰富的C 语言程序员,可以把这个字符复制程序编写得更精炼一些。在C语言中,类似于c = getchar()之类的赋值操作是一个表达式,并且具有一个值,即赋值后左边变量保存的值。也就是说,赋值可以作为更大的表达式的一部分出现。如果将为c赋值的操作放在while循环语句的测试部分中,上述字符复制程序便可以改写成下列形式: #include /* copy input to output;2nd version */ main(){ int c;while((c = getchar())!= EOF)putchar(c);} 在该程序中,while 循环语句首先读一个字符并将其赋值给c,然后测试该字符是否为文件结束标志。如果该字符不是文件结束标志,则执行while语句体,并打印该字符。随后重复执行while语句。当到达输入的结尾位置时,while循环语句终止执行,从而整个main函数执行结束。以上这段程序将输入集中化,getchar函数在程序中只出现了一次,这样就缩短了程序,整个程序看起来更紧凑。习惯这种风格后,读者就会发现按照这种方式编写的程序更易阅读。我们经常会看到这种风格。(不过,如果我们过多地使用这种类型的复杂语句,编写的程序可能会很难理解,应尽量避免这种情况。)对while语句的条件部分来说,赋值表达式两边的圆括号不能省略。不等于运算符!=的优先级比赋值运算符=的优先级要高,这样,在不使用圆括号的情况下关系测试!=将在赋值=操作之前执行。因此语句 c = getchar()!= EOF 等价于语句

c =(getchar()!= EOF)

下载4.2 C语言中的强制类型转换(精选多篇)word格式文档
下载4.2 C语言中的强制类型转换(精选多篇).doc
将本文档下载到自己电脑,方便修改和收藏,请勿使用迅雷等下载。
点此处下载文档

文档为doc格式


声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:645879355@qq.com 进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。

相关范文推荐

    c语言中的正则表达式regex.h

    c语言中的正则表达式regex.h 如果用户熟悉Linux下的sed、awk、grep或vi,那么对正则表达式这一概念肯定不会陌生。由于它可以极大地简化处理字符串时的复杂度,因此现在已经在许......

    C语言中extern关键字详解大全

    C语言中extern关键字详解作者:华清远见武汉华嵌 技术支持 曹伟东内容清单:1. 用extern声明外部变量在一个文件内声明的外部变量在多个文件中声明外部变量在多个文件......

    C语言中结构体的使用

    脚踏实地,心无旁骛,珍惜分分秒秒。紧跟老师,夯实基础。 什么是结构体? 简单的来说 结构体就是一个可以包含不同数据类型的一个结构 它是一种可以自己定义的数据类型 它的特点和......

    C语言中变量的存储类别

    一.C语言中,从变量的作用域角度来分,可以分为全局变量和局部变量。 二.变量值存在的时间角度来分,可以分为静态存储方式和动态存储方式。所谓静态存储方式是指在程序运行期间有......

    C语言中浮点数的表示范围浅析

    C语言中浮点数的表示范围浅析 摘 要:浮点数是C语言中的一种数据类型,但在标准C中并没有给出其具体的描述,即数的存储格式及表示范围。部分经典的C语言程序设计教程中给出了浮点......

    c语言中void的作用[5篇范文]

    1.概述 许多初学者对C/C++语言中的void及void指针类型不甚理解,因此在使用上出现了一些错误。本文将对void关键字的深刻含义进行解说,并 详述void及void指针类型的使用方法与......

    c语言中的整型常量和实型常量

    c语言中的整型常量和实型常量 整型常量和实型常量 1.整型常量 在 C 语言中,整型常量分为十进制整型常量、八进制整型常量和十六进制整型常量三 种表示形式。 (1)十进制整型常量......

    C语言中的几种常见数据类型

    C语言中的几种常见数据类型 整型(int) 一、整型数说明 加上不同的修饰符, 整型数有以下几种类型; signed short int 有符号短整型数说明。简写为short或int, 字长为2字节共1......