C/C++易错点

1、浮点数的转换
#include <iostream>
using namespace std;

int main(void)
{
        float a = 1.0f;
        cout<<(int)a<<endl;
        cout<<&a<<endl;
        cout<<hex<<(int&)a<<endl;
        cout<<boolalpha<<((int)a == (int&)a)<<endl;
        cout<<"----------"<<endl;
        float b = 0.0f;
        cout<<(int)b<<endl;
        cout<<&b<<endl;
        cout<<hex<<(int&)b<<endl;
        cout<<boolalpha<<((int)b == (int &)b)<<endl;
        return 0;
}
输出为:
1
0x7fff5fbffa9c
3f800000
false
----------
0
0x7fff5fbffa98
0
true
难点解释:浮点数转化为整数时,是取整,而化为整数引用时 (int&)a 相当于 *(int*)&a。 所以 float a=1.0f; (int)a 和 (int&)a 是不同的,1.0f在内存中是 3F800000,
3f800000H=0 01111111 00000000000000000000000B (注意我分成了三段)
符点型数据在X86机上占四个字节,其存储按IEEE754标准实现,即:

1位的符号位s 0(代表正数,1代表负数)

8位的指数位e(移码表示)01111111是0的移码

23位的小数位f 0000000000000000000000 表示小数部分为0

因此,作为int看待的话是1065353216,所以(int)a等于1,(int&)a等于1065353216。 而之所以当b=0.0f时,(int)b 和 (int&)b 相等,是因为0.0f和0的内存布局正好一致,都是 00000000。


2、sizeof(struct A);以结构体里面最长的数据元素为对齐单元,结构体的长度一定是最长的数据元素的整数倍,如果结构体内存在长度大于处理器的元素,那么就以处理器的位数为对齐单元。

3、空类的大小占一个字节

这里试图讨论为什么C++的结构体或类即使没有成员也需要一个字节的大小?
首先需要一个字节的作用在上个随笔中已经说明,是为了在生成实例的时候确定区别;但实际上在C里面是不支持空成员的结构体,直接报编译错误。
因此这是C++特有的特性,可能有如下的原因:
1.C++里面必须支持没有成员的类,比如纯虚类;这些类只有方法,没有数据成员(虽然会有虚表);但这些类不会被实例化。
2.为了达到统一,非纯虚类的C++结构体和类也会被C++支持,但他们需要实例化,所以需要提供一个字节来可以给他们分配内存。

而C里面是不支持没有成员的结构体(VC里面是编译不过的),其实完全没有必要支持这种无意义的定义,从而更简单。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值