栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C语言中的数据类型转换

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C语言中的数据类型转换

 C 语言中类型转换遵循下面原则:

1. 若参与运算量的类型不同,则先转换成同一类型,然后进行运算

2. 转换按数据长度增加的方向进行,以保证精度不降低。如int型和long型运算时,先把int量转成long型后再进行运算

            a、若两种类型的字节数不同,转换成字节数高的类型

            b、若两种类型的字节数相同,且一种有符号,一种无符号,则转换成无符号类型

#include 

int main()
{
    long i = -1;
    unsigned long j = 1;
    if(i > j)
        printf("-1L > 1ULn");
    else
        printf("1UL > -1Ln");
    return 0;
}

 上述代码的输出结果是 :

-1L > 1UL

之所以出现上述结果是由于在比较时候,带符号类型long自动转换成了unsigned类型

可见不同数据类型作比较或运算也许得不到预期的结果,程序中应避免这种情况。

另外看下面程序

#include 

int main()
{
    int i = -2;
    unsigned int j = 10;
    printf("%dn", i*j);
    printf("%dn", i*j/10);
    return 0;
}

 用gcc编译的运行结果为:

-20
429496727

 当用%d打印i*j的运算结果时,首先会把i转换成unsigned int类型,由于负数是以补码的形式表示,所以-2的补码是0xFFFFFFFE,i*j之后的值为0x9FFFFFFEC,在%d打印时会把其进行舍位操作,舍位之后为0xFFFFFFEC,最高位代表符号位,所以这个值为-20.

i*j/10计算过程是:先计算i*j,然后舍位后为0xFFFFFFEC,然后以unsigned int形式除以10, 由于是整数除法,会舍弃小数部分,所以实际计算过程为4294967276/10 = 429496727.

3. 所有的浮点运算都是以双精度进行的,即使是两个float单精度量运算的表达式,也要先转换成double型,再作运算.(书中说两个float型运算时并不会转换成double型)

4. char型和short型参与运算时,都先转换成int型

5. 在赋值运算中,赋值号两边量的数据类型不同时,赋值号右边量的类型将转换为左边量的类型。

             如果右边量的数据类型长度比左边长时,将丢失一部分数据,这样会降低精度,舍入方向根据机器不同而不同。

详细的数据类型转换规则见如下链接:

http://akaedu.github.io/book/ch15s03.html

编码时要注意:

1. 避免不同类型的数据参与运算(比较),如确实需要参与运算,一定要转换成同一类型进行。

例如上述代码,写成   printf("%dn", i*(int)j/10); 时才能得到正确的结果。

2. 强制类型转换不会改变原变量的数据属性

如下面代码:

#include 

int main()
{
    float i = 2.3;
    printf("%fn", (unsigned int)i);
    printf("%fn", i);
    return 0;
}

运行结果为: 

0.000000
2.300000

打印时强制转换i,并没有影响i本身的值。

注:float转int没有任何意义,因为两者的数据表示方法不同。(用floor或ceil函数)

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/509927.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号