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

问题描述 投票:1回答:5

希望你能帮助我:)

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

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

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

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

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

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

c hex int overflow long-integer
5个回答
4
投票

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

如果你的编译器像gcc一样符合C99,你也可以使用stdint.huint64_t,它保证独立于64位宽。

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

printf(" %llx ",hexNumber)


3
投票

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

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


1
投票

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

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

其他一个人建议使用%llx,长期使用int。试试这件事并不会有什么坏处。


0
投票

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


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中的字符串不仅会产生两个不必要的转换,它在语义上毫无意义。

© www.soinside.com 2019 - 2024. All rights reserved.