十六进制数对于长long int来说太大了?

时间:2011-12-05 15:46:39

标签: c hex int overflow long-integer

希望你能在这里帮助我:)。

我订购了一个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);

我在F中输入10位数0,但只打印8位数/字符。

必须存在某种整数溢出,但据我所知:

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

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

祝你好运 尼古拉斯 - 丹麦

5 个答案:

答案 0 :(得分:4)

你确定你的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)

答案 1 :(得分:3)

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

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

答案 2 :(得分:1)

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

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

其他一个人提出了%llx,对于long long int。试试这件事并不会有什么坏处。

答案 3 :(得分:0)

将数字输入管理大小的部分并将其存储为字符串。无限长的那种方式。

答案 4 :(得分:0)

  

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

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

  

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

为什么

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

但RFID只是名称。你没有对名称做任何这些事情,因为这样做没有意义。你不会说“kermit the frog”+8,或“miss piggy”<< 7或“fozzie bear”%3。 RFID就是这样。你只需阅读RFID,比较它们,或者哈希,然后将它们写出来。它们是不可分割的,不可思议的“魔法曲奇”字符串 - 它们只是代币。

所以你应该把它存储为一个字符串。将它读入int然后将其写回int中的字符串会产生两个不必要的转换,它在语义上毫无意义。