【问题标题】:64-bit integer declaration in C [duplicate]C中的64位整数声明[重复]
【发布时间】:2021-08-18 20:06:39
【问题描述】:

我试图用 unsigned long long 数据类型在 C 中声明 64 位变量,但它不起作用并且行为类似于 uint32 位变量。访问/检查 32 以上位的解决方案是什么?

#include <stdio.h>
#include <stdint.h>

int main() {
    // Write C code here
    printf("Hello world");
    unsigned long long temp = 0x1234567890123456ULL;
    unsigned long long temp2 = temp >> 1;
    
    uint64_t var = 0x1234567890123456; 
    
    printf("\n%x", (long long) temp); 
    printf("\n%x", (long long) temp2); 
    printf("\n%x", 1ULL << 31ULL);
    printf("\n%x", 1ULL << 32ULL);
    
    printf("\n%x", var); 
    
    return 0;
}

输出:

世界你好

90123456

48091a2b

80000000

0

90123456

【问题讨论】:

  • 您告诉printf() 打印unsigned int 而不是unsigned long long int
  • 编译代码时编译器没有给你警告吗?默认情况下,clang 和 gcc 都会对此发出警告并告诉您如何修复它。

标签: c types


【解决方案1】:

您对printf() 使用了错误的格式说明符。 %x 用于打印unsigned intprintf() 中的格式说明符和实际数据不匹配会调用未定义的行为

要以十六进制打印整数,您应该使用%llx 表示unsigned long longPRIx64(来自inttypes.h)表示uint64_t

#include <stdio.h>
#include <inttypes.h>

int main() {
    // Write C code here
    printf("Hello world");
    unsigned long long temp = 0x1234567890123456ULL;
    unsigned long long temp2 = temp >> 1;
    
    uint64_t var = 0x1234567890123456; 
    
    printf("\n%llx", (long long) temp); 
    printf("\n%llx", (long long) temp2); 
    printf("\n%llx", 1ULL << 31ULL);
    printf("\n%llx", 1ULL << 32ULL);
    
    printf("\n%" PRIx64, var); 
    
    return 0;
}

【讨论】:

  • “以十六进制打印整数……”嗯……对我来说,这并不清楚/不正确。应该是“打印 64 位整数....”
  • @MikeCat:谢谢!它奏效了。
  • long long 的强制转换也应该被删除。说明符需要unsigned long long,所以我们不应该传递signed long long
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-14
  • 2011-10-05
  • 2016-10-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多