【问题标题】:Hexadecimal number too large for long long int?十六进制数对于 long long int 来说太大了吗?
【发布时间】:2012-01-13 08:18:33
【问题描述】:

希望你能帮帮我:)

我已经订购了一个 RFID 标签和扫描仪,用于业余爱好。标签正在向标签发送输入,我想在 C 程序中使用。

问题是.. 标记正在发送十六进制代码 - 10 个字符 - 长。

我尝试将这个数字存储在一个 long long int 变量中,但它似乎不起作用。

当我使用 printf 打印变量时,只打印前 8 个字符。其余部分(2 位数字省略)。

long long int n1;
n1 = recieve_data();
printf("%lx", n1);

我也尝试自己输入 10 位十六进制数,这样做:

long long int n1;
scanf("%lx", &n1);
printf("%lx", n1);

我输入了 0 到 F 的 10 位数字,但只打印了 8 位数字/字符。

一定有某种整数溢出,但据我所知:

1 位十六进制数 = 4 位。那么十六进制的 10 位数字 = 40 位? - long long int 应该足够了!

如果我的直觉是正确的,并且发生整数溢出,那么我该如何解决这个问题?显然没有变量大到足以容纳 10 位十六进制值?

最好的问候 尼古拉斯 - 丹麦

【问题讨论】:

  • %lx 不会打印任何前导零。如果十六进制字符串的前两位实际上不是零,那么您没有正确转换十六进制字符串。我们看不到那个代码。
  • 我赌的是sizeof long == 4,所以应该是%llx

标签: c hex int overflow long-integer


【解决方案1】:

标签正在发送十六进制代码 - 10 个字符

我很确定您的意思是“标签将 RFID 作为 10 个字符的 ASCII 字符串发送,仅限于 16 个十六进制数字”

我尝试将这个数字存储在一个 long long int 变量中,

为什么

int 及其朋友是算术 类型。您可以使用它们来存储您计划对其执行算术运算的值。您可以将它们递增、将 73 添加到它们、将它们向左位移 3、按位 OR 或将它们用作索引。

但 RFID 只是一个名称。您不会对名称做任何这些事情,因为这样做没有意义。你不会说“kermit the frog”+8,或“miss piggy”

所以你应该把它存储为一个字符串。不仅将它读入一个 int 然后将它从一个 int 写回一个字符串会产生两次不必要的转换,而且在语义上是没有意义的。

【讨论】:

    【解决方案2】:

    10 个十六进制字符只有 40 位。 long long int 保证至少为 64 位,所以你可以使用它。

    问题实际上在于您的 printf 格式字符串 - %lxunsigned long int 的正确格式字符串,而不是 long long int。要打印long long int,您应该使用%lld - 如果您想以十六进制打印,您应该将其声明为unsigned long long int,并使用%llx

    【讨论】:

      【解决方案3】:

      您正在使用 %lx 进行扫描和打印。

      据我了解,格式字符串 %lx 是一个 long int,而不是 long long int。根据您的硬件,long int 可能只能获得 32 位。

      其中一个人建议使用 %llx, for long long int。尝试一下不会有什么坏处。

      【讨论】:

        【解决方案4】:

        将数字带入管理大小的部分并将其存储为字符串。这样无限长。

        【讨论】:

        • 谢谢大家,原来是我需要在微软系统上将号码存储为 %l64。
        • 将数字带入管理大小的部分并将其存储为字符串。这样无限长。你会怎么做?
        【解决方案5】:

        您确定您的 long long int 是 64 位宽,您的环境是什么,嵌入式、PC、32 位还是 64 位?编译器?

        如果您的编译器像 gcc 一样符合 C99,您还可以使用 stdint.huint64_t,它们保证独立于平台为 64 位宽。

        您应该重新检查您的 printf() 文档,例如在我的 64 位 OpenSuse 框中,带有 gcc 的 long 以及 long lont int 通过 sizeof() 是 64 位宽。要打印它们,我使用:


        printf(" %llx ",hexNumber)

        【讨论】:

        • 如果你的编译器兼容 C99,那么long long int 保证至少有 64 位长。
        • 所有编译器和嵌入式平台都在那里,没有任何保证,甚至有人用 Visual Studio c++ 做 C。
        • 同意,我专门回复了您以 “如果您的编译器符合 C99...”开头的段落
        猜你喜欢
        • 1970-01-01
        • 2015-12-18
        • 1970-01-01
        • 1970-01-01
        • 2011-07-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-11
        相关资源
        最近更新 更多