C语言 U64与U8计算求助

antuicang9886 2017-11-26 09:38:58
做了个U64结合U8的加法计算,可是在特定情况下得不到正确的结果,想求问大神了解下原因,代码如下:

#include<stdio.h>
typedef unsigned __int64 UINT64;
typedef unsigned char UINT8;

void test(void)
{
UINT8 a = 0xff;
UINT64 b = 0x00000000ffffff;
printf("a = 0x%x\n", a);
printf("a<<24 = 0x%x\n", a<<24);
printf("b = 0x%x\n", b);
printf("sum:b+a<<24 = 0x%016I64x\n", b+(a<<24));
}

main()
{
test();
}

上述代码其实就是把0xff000000加上0x00ffffff,期望得到0xffffffff。但是实际上得到的却是16个f。

尝试过把a改为0x11,结果就是正确的,同时尝试过把a改为UINT64,结果也是正确的。

而手动计算printf("0x%016I64x", 0xff000000+0x00ffffff);也能得到正确结果,想知道下具体的出错原因。

不胜感激。
...全文
507 6 打赏 收藏 举报
写回复
6 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
das白 2017-11-27
引用 3 楼 das白的回复:
试试这个
图片上不去... 输出格式都为 0x%x
  • 打赏
  • 举报
回复
das白 2017-11-27
试试这个
  • 打赏
  • 举报
回复
「已注销」 2017-11-27
你给一个 UINT8 左移 24 位还想得到正确结果……
  • 打赏
  • 举报
回复
heronism 2017-11-27
printf("sum:b+a<<24 = 0x%016I64x\n", b+(a<<24));
改为
printf("sum:b+a<<24 = 0x%016I64x\n", b+(((unsigned int)a)<<24));
可以吗
  • 打赏
  • 举报
回复
自信男孩 2017-11-27
主要原因是a 是unsigned char类型,在执行b + (a <<24)时,现将unsigned char 类型转int类型,然后int类型再转u64;这个过程是类型隐式提升 所以在转int类型时,已经是有符号数,再转u64时,就是最高位位符号位,所以是除低24位位0,其他64 - 24位位1; 解决办法可以考虑:
printf("sum:b+a<<24 = 0x%llx\n", b+((unsigned int)a<<24));
这个办法是去掉u8 转int这个过程,直接跳到u32; 也可以这么解决:
printf("b = %#llx\n", (b << 8)+ a);
  • 打赏
  • 举报
回复
(a<<24)的结果是一个int,与b相加的时候被扩展到64位(符号扩展)。 像#1那样把a或者a<<24作为无符号数处理就可以了。
  • 打赏
  • 举报
回复
相关推荐
发帖
C语言
加入

6.6w+

社区成员

C语言相关问题讨论
社区管理员
  • C语言
  • 小灸舞
申请成为版主
帖子事件
创建了帖子
2017-11-26 09:38
社区公告
暂无公告