科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件c语言中的类型转换与复合类型

c语言中的类型转换与复合类型

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

讲述了c语言中的类型转换与复合类型中应该注意的几个问题。

作者:Paid 来源:CSDN 2008年3月21日

关键字: 复合类型 类型转换 C++ C Linux

  • 评论
  • 分享微博
  • 分享邮件

数据类型转换是C语言中颇具争议的一个话题,这里不多加评论,单就其中整形与浮点型之间的转换做一些解说. 
由于表示范围的原因,你可能认为把整型数转换为浮点型一定是安全的,但实际上不是这么简单。因为浮点型存储的数值虽然大但却受精度的限制。
如unsigned int u=4294967295;
float f=u;
接过f变成了4294967296.000000
所以要把一个整形换成float在转换回来还要和原先的数相同,则这个数只能有6位有效数字。否则会有精度损失。而要把浮点换成整形,首先可以肯定小数部分被舍掉了。另外还要注意,转换的第一步必须是以下的一种类型:
int     unsigned     long     unsigned long     long long     unsigned long long  
如:
float f=12345.678;
int i=f;
short s=i;
否则直接转换到short 得到的就根本不是12345了。(与平台有关,windows不存在这个问题)

对于复合类型,主要是要注意由于数据对齐要求而导致的存储空间浪费。这里举一个例子:
struct s
{
    char x;
    int y;
    char z;
    int u;
};             /*s占16个字节*/
struct s
{
    int y;    /*4*/
    int u;    /*4*/
    char x;    /*1*/
    char z;    /*3*/
};             /*s占12个字节*/
注意这里第二个定义中为什么不是10,这还是由于数据对齐的原因,因为不能只考虑单个变量的情况,还有可能是结构体数组变量,struct s array[10],知道原因了吧。另外一种可能就是在函数调用中,结构体变量作为一个参数要压栈,是以4字节为一个单元压栈的。

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章