【问题标题】:Unsigned long hexadecimal representation无符号长十六进制表示
【发布时间】:2013-10-20 14:25:57
【问题描述】:
#include <stdio.h>
#include <string.h>

int main(void) {
    char buf[256] = {};
    unsigned long i=13835058055298940928;
    snprintf(buf, 1024, "%lx", i); /* Line 7 */
    printf("%s\n",buf);
    return 0;
}

在第 7 行,如果我使用%lux,然后snprintf 不会进行任何转换。它只打印0x13835058055298940928x,而如果我只使用%lx,它会打印预期的十六进制转换。

如何用十六进制表示 unsigned long?

【问题讨论】:

  • 十六进制不关心有符号或无符号 - x 就是你所需要的。
  • %lux 似乎被视为%lu + x
  • 你通过1024 代替256 作为缓冲空间
  • 您并没有真正尝试将 13835058055298940928 放入无符号长整数中,是吗?在我的系统(win7 x64)上,sizeof(long) 为 4 - 即 32 位长。这为您提供了 32 个无符号位的最大值:4294967295。看到问题了吗?你想把大象塞进兔笼。所有赌注都自动关闭!!实际上,您的数字是您可以放入 32 位的最大数字的 3,221,225,472.75 倍。它是无符号 64 位表示中可以容纳的最大数字的 75%。
  • @PaulR:十六进制("%x" 格式)不关心有符号;无符号是你得到的全部。

标签: c


【解决方案1】:

"%lux" 的格式被视为"%lu"(无符号长整数,十进制)后跟一个字母x

"%x" 格式需要一个无符号类型的参数;没有(直接)机制以十六进制格式打印有符号整数。

以十六进制打印unsigned long 值的格式是"%lx"。 (x 是十六进制,d 是有符号十进制,u 是无符号十进制;它们中的任何一个都可以用l 限定长。)

请注意,值13835058055298940928 至少需要一个 64 位无符号类型来存储它而不会溢出。 unsigned long 类型至少为 32 位;它在 一些 系统上是 64 位,但绝不是全部。如果你希望你的代码是可移植的,你应该使用unsigned long long而不是unsigned long。以十六进制打印unsigned long long 值的格式为"%llx"

为了清楚起见,我通常在十六进制输出前加上0x,因此读者很明显这是一个十六进制数:

printf("0x%llx\n", some_unsigned_long_long_value);

(您可以使用%#llx 获得相同的结果,但我发现写出0x 比记住# 标志的含义更容易。)

【讨论】:

  • 获得我的投票。对 32/64 位细节的更好和更彻底的覆盖——尤其是那些关于便携性的细节。 :thumbup:
  • 如果你需要一个无符号的 64 位整数;使用uint64_tuint_least64_tuint_fast64_t 请求一个无符号的64 位整数。 unsigned long long 应该(但遗憾地不是)被认为是 uint_fast64_t 的过时和过时的同义词(就像 int 应该是,但遗憾的是不是,被认为是 int_fast16_t 的过时和弃用的同义词)。 ;-)
猜你喜欢
  • 1970-01-01
  • 2011-06-06
  • 2011-08-24
  • 1970-01-01
  • 2013-04-15
  • 2017-08-10
  • 2014-10-22
  • 2011-08-09
  • 1970-01-01
相关资源
最近更新 更多