判断大小端的错误做法

这里不详细讲解大小端的区别,只讲解判断大小端的方法。

1.大端,小端的区别

0x123456 在内存中的存储方式

大端是高字节存放到内存的低地址

小端是高字节存放到内存的高地址

2.大小端的判断

1.错误的做法

int main()
{
    int a=0x1234;
    char c=(char)a;
    
    if(c==0x12)
        cout<<"大端\n";
    else
        cout<<"小端\n";
    return 0;
}

应该有不少人是这样想的。直接就强制类型转换。

但是,int型数值赋给char型变量时,只保留其最低8位,高位部分舍弃。

所以在大端环境进行测试,这个例子也只能得到c==0x34,也即是小端。

强制类型转换等运算是编译器提供的运算,这个运算是高于内存层次的。

2.正确的做法

int main()
{
    int a = 0x12345678;
	char b = *((char *)(&a));		// 指针方式,取地址
	if(0x78 == b)
        cout<<"小端\n"
    else if(0x12 == b)
	    cout<<"大端\n";

    return 0;
}

取地址做法才是正确的。

还有一种使用联合体union做法,这种本质就是取地址做法。

3.总结

意识到直接进行强制类型转换来判断大小端是错误的。而虽然取地址方法也用到了强制类型转换,但其进行内存调用,取地址的,是可行的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值