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)%d\n",a,j);

printf("(int)%d→(unsigned)%u\n",i,b);

}

运行结果为:

(unsigned)65535→(int)-1

(int)-1→(unsigned)65535

计算机中数据用补码表示,int型量最高位是符号位,为1时表示负值,为0时表示正值。如果一个无符号数的值小于32768则最高位为0,赋给

int型变量后、得到正值。如果无符号数大于等于32768,则最高位为1,赋给整型变量后就得到一个负整数值。反之,当一个负整数赋给unsigned

型变量时,得到的无符号值是一个大于32768的值。

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

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

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

强制类型转换 强制类型转换

当操作数的类型不同,而且不属于基本数据类型时,经常需要强制类型转换,将操作数转化为所需要的类型。强制类型转换具有两种形式,称为显式强制转换和隐式强制类型转换。

1、显式强制类型转换

显式强制类型转换需要使用强制类型转换运算符,格式如下:

type()

(type)

其中,type为类型描述符,如int,float等。为表达式。经强制类型转换运算符运算后,返回一个具有type类型的数值,这种强制类型转换操作并不改变操作数本身,运算后操作数本身未改变,例如:

int nVar=0xab65;

char cChar=char (nVar);

上述强制类型转换的结果是将整型值0xab65的高端两个字节删掉,将低端两个字节的内容作为char型数值赋值给变量cChar,而经过类型转换后nVar的值并未改变。

2、隐式强制类型转换

隐式类型转换发生在赋值表达式和有返回值的函数调用表达式中。在赋值表达式中,如果赋值符左右两侧的操作数类型不同,则将赋值符右边操作数强制转换为赋值符左侧的类型数值后,赋值给赋值符左侧的变量。在函数调用时,如果return后面表达式的类型与函数返回值类型不同,则在返回值时将return后面表达式的数值强制转换为函数返回值类型后,再将值返回,如:

int nVar;

double dVar=3.88;

nVar=dVar;//执行本句后,nVar的值为3,而dVar的值仍是3.88

1,若已知x,y为double类型,则表达式:x=1,y=x+3/2结果是多少啊?

因为x,y都是double型,所以执行了y=x+3/2这个语句后,会输出小数部分,double型默认的是小数点后几位我忘了,你自己调试下,就会明白了!

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

简单的例子:

#include

#include

int main()

{

clrscr();

double dNum=28.123456789;

long lNum=12;

printf("\nlong(dNum*10000)\n");

printf("\ndNum2long:%f->%ld\n\n\n",dNum,long(dNum*10000));

printf("\ndouble(long(dNum*10000)/10000)\n");

printf("\ndlong2double:%ld->%f\n\n\n",long(dNum*10000),double(long(dNum*10000)/10000));

printf("\ndouble(long(dNum*10000)/10000.0)\n");

printf("\ndlong2double:%ld->%f\n\n\n",long(dNum*10000),double(long(dNum*10000)/10000.0));

printf("\n(double(long(dNum*10000))/10000)\n");

printf("\ndlong2double:%ld->%f\n",long(dNum*10000),(double(long(dNum*10000))/10000));

getch();

return 0;

}

将上面的程序在BC3.1中编译查看结果。

另外还可以参看论文:

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

各类数值型数据间的混合运算 谭浩强C语言

整型(包括int, short, long)和实型(包括float,

double)数据可以混合运算,字符型数据可以与整型通用。因此,整型、实型、字符型数据间可以混合运算。例如:10+'a'+1.5-8765.1234*'b'是合法的。在进行运算时,不同类型的数据要先转换成同一类型,然后进行运算。转换的规则如图所示:

double ←── float 高

long

unsigned

int ←── char,short 低

图中横向向左的箭头表示必定的转换,如字符数据必定先转换为整数,short型转换为int型,float型数据在运算时,一律先转换成双精度型,以提高运算精度(即使是两个float型数据相加,也先都化成double型,然后再相加)。

纵向的箭头表示当运算对象为不同类型时转换的方向。例如int型与double型数据进行运算,先将int型的数据转换成double型,然后在两个同类型(double型)数据间进行运算,结果为double型。注意箭头方向只表示数据类型级别的高低,由低向高转换。不要理解为int型先转换成unsigned

int型数据,再转换成long型,再转换成double型。如果一个int型数据与一个double型数据运算,是直接将int

型转换成double型。同理,一个int型与一个long型数据运算,先将int型转换成long型。

换言之,如果有一个数据是float型或double型,则另一数据要先转换成double型,运算结果为double型。如果参加运算的两个数据中高级别为long型,则另一数据先转换成long型,运算结果为long型。其他依次类推。

假设已指定i为整型变量,f为float变量,d为double型变量,e为long型,有下面式子:

10+'a'+i*f-d/e

运算次序为:①进行10+'a'的运算,先将'a'转换成整数97,运算结果为107。②进行i*f的运算。先将i与f都转换成double型,运算结果e为double型。③整数107与i*f的积相加。先将整数107转换成双精度数(小数点后加若干个0,即107.0000....00),结果为double型。④将变量e化成double型,d/e结果为double型。⑤将10+'a'+i*f的结果与d/e的商相减,结果为double型。

c语言强制转换字符类型,C语言中的数据类型转换问题相关推荐

  1. c语言强制转换字符类型,C语言数据类型转换实例代码

    数据类型转换就是将数据(变量.表达式的结果)从一种类型转换到另一种类型.例如,为了保存小数你可以将int类型的变量转换为double类型. 数据类型转换的一般格式为: (type_name) expr ...

  2. c语言强制转换是四舍五入,c语言强制转换四舍五入.docx

    c语言强制转换四舍五入 在C语言中,强制转换后的数是四舍五入还是去尾?去尾要想四舍五入的话(int)(number+0.5)都是直接去尾的.当为数太多时直接截断.所以在强制转换时要很注意C语言有没有数 ...

  3. python程序设计语言是什么类型的语言-Python 是弱类型的语言 强类型和弱类型的语言区别...

    Python 是弱类型的语言 在强类型的编程语言中,定义变量时要指明变量的类型,而且赋值的数据也必须是相同类型的,C语言.C++.Java 是强类型语言的代表. 下面我们以 C++ 为例来演示强类型语 ...

  4. Flink系列之:基于scala语言实现flink实时消费Kafka Topic中的数据

    Flink系列之:基于scala语言实现flink实时消费Kafka Topic中的数据 一.引入flink相关依赖 二.properties保存连接kafka的配置 三.构建flink实时消费环境 ...

  5. C语言 | 建立链表,输出各结点中的数据

    例42:C语言实现一个简单链表,它由3个学生数据的结点组成,要求输出各结点中的数据. 解题思路:读者在学习这道例题的时候,应该首先分析三个问题. 各个结点是怎么样构成链表的? 没有头指针head行不行 ...

  6. java 类型转换方法_Java中的实用类型转换的方法

    Java中的实用类型转换的方法 1,              类型转换 JAVA中常用数据类型转换函数 虽然都能在JAVA API中找到,整理一下做个备份. string->byte Byte ...

  7. java数据类型的转换函数_JAVA中常用数据类型转换函数

    JAVA中常用数据类型转换函数: string->byte Byte static byte parseByte(String s) byte->string Byte static St ...

  8. c语言 强制转换 作用域,C语言之总结1详解

    1). 终端常用的命令: pwd 显示终端的工作路径. ls  list 清单 显示当前工作路径下的所有的文件以及文件夹. ls -l 以详细信息显示当前工作路径下的所有的文件以及文件夹. cd 要切 ...

  9. C语言强制转换与输出格式不对应问题

    强制转换共分两种 第一种:(int ) (x+y); 第二种:(int )x+y;针对这两种的程序运算以及出错点: #include<stdio.h> int main() {int a; ...

最新文章

  1. Python Module — WSME
  2. billibilli html5播放,Thousands of people online are involved in ef...
  3. 不负众望,窝窝世界新版放出(内测):P
  4. 表示自己从头开始的句子_微信拍一拍后缀幽默回复有趣的句子 拍了拍唯美内容文案...
  5. GridView - Batch Editing - How to cancel editing or disable the editor conditionally
  6. 面试10大算法汇总+常见题目解答
  7. ubuntu 设置tab键自动补全
  8. IE8浏览器跨域接口访问异常的解决办法
  9. 阶段1 语言基础+高级_1-3-Java语言高级_08-JDK8新特性_第1节 常用函数接口_16_常用的函数式接口_Function接口中的方法Apply...
  10. C#使用Parallel处理数据同步写入Datatable并使用BulkInsert批量导入数据库
  11. 分析 AlphaGo 算法原理的本质
  12. 「 英雄哪里出来 」算法博客阅读指引
  13. 如何防止输入同样的编号到数据库中(30分)
  14. Camunda与springboot集成入门实战
  15. Google earth engine(GEE):基于MODIS的LST(地表温度数据)计算一定时间序列的城市热岛强度(UHI),并绘制直方图
  16. 数据结构与算法-平衡二叉搜索树
  17. Dataframe中na.fill的用法
  18. Python调用百度AI接口体验人像动漫化
  19. MySQL最重要的日志-binlog详解
  20. el-table高亮显示

热门文章

  1. Android自动开关机实现, AlarmManager实现开关机闹钟
  2. 设计模式——20 备忘录模式
  3. Mac怎么为备忘录设置密码?
  4. 手把手教你写一个Vue3组件库但是乞丐版
  5. JS对象的可枚举属性和不可枚举属性
  6. 波音承认:软件测试走捷径导致了载人飞船首飞失败
  7. vue表单验证,多种校验规则
  8. JavaScript中的数组常用方法总结
  9. 苹果手机喇叭灰尘清理_手机清理灰尘
  10. .bashrc 添加点环境变量