加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 定义(1 << 31)或使用0x80000000?结果不同

发布时间:2020-12-16 10:13:41 所属栏目:百科 来源:网络整理
导读:#define SCALE (1 31)#define fix_Q31_80(x) ( (int) ( (float)(x)*(float)0x80000000 ) )#define fix_Q31_SC(x) ( (int) ( (float)(x)*(float)SCALE ) )int main(){ int fix_80 = fix_Q31_80(0.5f); int fix_sc = fix_Q31_SC(0.5f);} 为什么值fix_80和fix_s
#define SCALE (1 << 31)

#define fix_Q31_80(x) ( (int) ( (float)(x)*(float)0x80000000 ) )
#define fix_Q31_SC(x) ( (int) ( (float)(x)*(float)SCALE      ) )

int main()
{
    int fix_80 = fix_Q31_80(0.5f);
    int fix_sc = fix_Q31_SC(0.5f);
}

为什么值fix_80和fix_sc不同?

fix_80 == Hex:0x40000000
fix_sc == Hex:0xc0000000

解决方法

1<< 31是大多数平台上的未定义行为(例如,具有16位或32位int的系统),因为其结果不能在int中表示(结果类型的表达式).不要在代码中使用该表达式.另一方面,1U<< 31是具有32位int的系统上的有效表达式,因为其结果可在unsigned int(表达式的结果类型)中表示. 在32位int系统上,0x80000000是unsigned int类型的(相对)大正整数.如果你幸运(或不幸)足以让恶魔通过使用1<<<<<<<<< 31表达式,该表达式最可能的结果是INT_MIN,它是int类型的(相对)大的负整数.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读