【问题标题】:How to perform shift left of 64bit in C如何在C中执行64位左移
【发布时间】:2017-05-26 03:29:11
【问题描述】:

我正在尝试将两个 32 位值复制到一个 64 位地址中。 一个 DWORD 是高 32 位,第二个是低 32 位。 我尝试了以下方法,但 64 位值中的移位操作数不起作用:

UINT64 a = 0x12341234;
UINT64 b = 0x00003800;

我需要的值是: 0x0000380012341234

所以我做到了:

printf("b 0x%016x\n", b);
b = ((UINT64)b) << 20;
printf("b 0x%016x\n", b); 

和我得到的照片:

b 0x0000000000003800

b 0x0000000080000000

我尝试切换到不同的数字(再次是 10 和 10,或 32,或 0x20),但没有任何效果。

为什么转移到 UINT64 的高 32 位不起作用,我还能怎么做?

【问题讨论】:

  • %016x更改为%016llx
  • 班次工作正常,问题在于打印。

标签: c uint64


【解决方案1】:

您的格式说明符告诉 printf 该参数是普通的(可能是 32 位)int,因此它会切断前 32 位(因为您的计算机必须是小端序)。

您可以使用%llx,但如果是这样,我也很想将参数转换为unsigned long long

printf("b 0x%016llx\n", (unsigned long long)b);

C11 还在 inttypes.h 中定义了一些固定宽度的格式说明符,以使其在没有强制转换的情况下安全 - PRIx64 是您需要的。

【讨论】:

    【解决方案2】:

    它唯一的 printf() 类型问题。我试过了,效果很好。

    #include <stdio.h>
    #include <stdlib.h>
    
    #define UINT64 unsigned long long
    
    int main()
    {
        UINT64 a = 0x12341234;
        UINT64 b = 0x00003800;
        printf("b 0x%016llx\n", (unsigned long long)b);
        b = ((UINT64)b) << 32;
        printf("b 0x%016llx\n",(unsigned long long) b);
        system("pause");
    }
    

    希望对您有所帮助。 :)

    【讨论】:

    • 是的,非常正确。实际上它已经被提及,所以我没有删除它。
    • @VishwajeetVishu-还需要添加吗?
    • @Peter 提出问题的方式似乎足够聪明
    【解决方案3】:

    您可以将常量转换为unsigned long long,但也可以告诉词法分析器直接将其转换为unsigned long long,就像这样

    printf("%x\n", 0xnnnnnnnnULL);
    

    在这种情况下,词法分析器将生成一个整数类型的 c-lexeme,类型为 unsigned long long,无需转换。

    【讨论】:

      【解决方案4】:

      要添加到 Vishwajeet 的帖子,当然应该添加:

      #include <stdio.h>
      #include <stdlib.h>
      
      #define UINT64 unsigned long long
      
      int main()
      {
          UINT64 a = 0x12341234;
          UINT64 b = 0x00003800;
          printf("b 0x%016llx\n", (unsigned long long)b);
          b <<= 32;
          b += a;
          printf("b 0x%016llx\n",(unsigned long long) b);
          system("pause");
      }
      

      【讨论】:

        猜你喜欢
        • 2012-04-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-08
        • 2018-02-26
        • 2011-02-19
        • 1970-01-01
        相关资源
        最近更新 更多