`
jishublog
  • 浏览: 868899 次
文章分类
社区版块
存档分类
最新评论

详解C语言的类型转换

 
阅读更多

详解C语言的类型转换


1.自动类型转换

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

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

2.赋值中的类型转换

当赋值运算符两边的运算对象类型不同时,将要发生类型转换, 转换的规则是:把赋值运算符右侧表达式的类型转换为左侧变量的类型。具体的转换如下:
(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)%d\n",a,j);
    printf("(int)%d→(unsigned)%u\n",i,b);
}
运行结果为:
  • 计算机中数据用补码表示,int型量最高位是符号位,为1时表示负值,为0时表示正值。如果一个无符号数的值小于32768则最高位为0,赋给 int型变量后、得到正值。如果无符号数大于等于32768,则最高位为1, 赋给整型变量后就得到一个负整数值。反之,当一个负整数赋给unsigned 型变量时,得到的无符号值是一个大于32768的值。(这里假定int型占两个字节)
  • C语言这种赋值时的类型转换形式可能会使人感到不精密和不严格,因为不管表达式的值怎样,系统都自动将其转为赋值运算符左部变量的类型。
  • 而转变后数据可能有所不同,在不加注意时就可能带来错误。 这确实是个缺点,也遭到许多人们批评。但不应忘记的是:C面言最初是为了替代汇编语言而设计的,所以类型变换比较随意。当然, 用强制类型转换是一个好习惯,这样,至少从程序上可以看出想干什么。

3.强制类型转换

可以利用强制类型转换运算符将一个表达式转换成所需类型:
例如:
(double)a (将a转换成double类型)
(int)(x+y) (将x+y的值转换成整型)
(float)(5%3) (将5%3的值转换成float型)
(int)(1.5+2.3) = 3
(int)1.5+2.3=?
对于从高到低的强制转换,实质上就是一个截断的操作,只把低端需要的部分保留,其余的部分直接扔掉了。


在评论中无法发送图片,下面是对一楼的回复,希望能解答你的疑惑!


分享到:
评论

相关推荐

    C语言类型转换详解与示例

    1、本文详细描述了c语言类型转换。 2、通过详细示例,让读者更直观地阅读,更清晰的理解。 3、示例代码可直接复制,编译后可直接运行。 4、根据示例以及运行结果,让读者加强记忆及理解。

    C语言实现进制转换函数的实例详解

    主要介绍了C语言实现进制转换函数的实例详解的相关资料,这里提供实现实例帮助大家实现改功能,需要的朋友可以参考下

    详解C语言中的char数据类型及其与int类型的转换

    主要介绍了详解C语言中的char数据类型及其与int类型的转换,是C语言入门学习中的基础知识,需要的朋友可以参考下

    C语言命令详解(最新第二版)

    运算符,类型转换,关键字,预处理指令以及库函数和库类.四个附录 分别介绍 C/C++的区别,ANSI 及 C++成员的速查表.本书最后有 C++术 语及概念的词汇表.本书可以用作学习 C++的标准教材,也可成为高 级程序员的有价值的...

    高级C语言详解

    60. 高级C语言程序员测试必过的十六道最佳题目+答案详解 297 61. C语言常见错误 320 62. 超强的指针学习笔记 325 63. 程序员之路──关于代码风格 343 64. 指针、结构体、联合体的安全规范 346 65. C指针讲解 352 66...

    详解C语言常用的一些转换工具函数

    1、字符串转十六进制 代码实现: void StrToHex(char *pbDest, char *pbSrc, int nLen) { char h1,h2; char s1,s2; int i; for (i=0; i<nLen xss=removed xss=removed xss=removed> 9) ... if (s2 >

    完全手册单片机C语言开发详解系列之DA转换实战—模拟量输出电路与软件设计PPT学习教案.pptx

    完全手册单片机C语言开发详解系列之DA转换实战—模拟量输出电路与软件设计PPT学习教案.pptx

    C语言进制转(互转)详解

    详细讲述C语言各种进制转换、互转原理,附件有实例。

    详解C语言中printf输出的相关函数

    C语言printf()函数:格式化输出函数 printf()函数是最常用的格式化输出函数,其原型为: int printf( char * format, ... ); printf()会根据参数 format 字符串来转换并格式化数据,然后将结果输出到标准输出...

    C语言数据类型转换实例代码

    本文主要介绍C 语言数据类型转换,这里通过代码实例进行详解,这是C语言基础部分,需要的朋友可以参考下

    c语言难点分析整理,C语言

    60. 高级C语言程序员测试必过的十六道最佳题目+答案详解 297 61. C语言常见错误 320 62. 超强的指针学习笔记 325 63. 程序员之路──关于代码风格 343 64. 指针、结构体、联合体的安全规范 346 65. C指针讲解 352 66...

    详解C语言中的memset()函数

    C语言memset()函数:将内存的前n个字节设置为...你既可以向 value 传递 int 类型的值,也可以传递 char 类型的值,int 和 char 可以根据 ASCII 码相互转换。 num 为 ptr 的前 num 个字节,size_t 就是unsigned int。

    VC常用数据类型使用转换详解

    本文给大家分享了VC常用数据类型使用转换详解。

    详解C语言进程同步机制

    ​ 在前面的博客中讲述了进程的状态及其状态的转换,每种状态的含义和转换的原因。同样我们也知道,在OS引入了进程后,可以使系统中的多道程序可以并发的执行,进程的并发执行一方面极大的提高了系统的资源利用率和...

    详解C语言数组中是以列优先吗

    从行优先转换为列优先存储方式,与行优先相比,不同之处在于改变了数组维界基址的先后顺序, 从而改变了映像函数常量基址。 /** * @brief C语言 数组 列优先 实现 * @author wid * @date 2013-11-02 * * @note ...

    C语言的编译原理详解.docx

    C语言的编译过程包括预处理、编译、汇编和链接四个主要阶段。 1. 预处理阶段:预处理器处理源代码,包括插入头文件、宏展开、条件编译和删除注释等,生成预处理后的源代码。 2. 编译阶段:编译器将预处理后的源...

    解析C++中四种强制类型转换的区别详解

    本篇文章是对C++中四种强制类型转换的区别进行了详细的分析介绍,需要的朋友参考下

Global site tag (gtag.js) - Google Analytics