Шестнадцатеричное число слишком большое для long long int? - PullRequest
1 голос
/ 05 декабря 2011

Надеюсь, вы можете помочь мне здесь:)

Я заказал RFID-метку и сканер для хобби. Тег отправляет входные данные тегу, который я хочу использовать в C-программе.

Проблема в том, что тег отправляет код в шестнадцатеричном формате - 10 символов - в длину.

Я пытался сохранить это число в длинной длинной переменной 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 до F, но печатаются только 8 цифр / символов.

Должно быть какое-то целочисленное переполнение, но насколько я знаю:

1 цифра в шестнадцатеричном виде = 4 бита. Тогда 10 цифр в шестнадцатеричном виде = 40 бит? - long long int должно быть достаточно!

Если мои инстинкты верны, и происходит целочисленное переполнение, то как я могу это исправить? Очевидно, что ни одна переменная не является достаточно большой, чтобы содержать десятизначное шестнадцатеричное значение?

С наилучшими пожеланиями Николас - Дания

Ответы [ 5 ]

4 голосов
/ 05 декабря 2011

Вы уверены, что ваша длинная длинная int имеет ширину 64 бита, какова ваша среда, встроенная, ПК, 32 или 64 бит? Компилятор

Если ваш компилятор совместим с C99, например, gcc, вы также можете использовать stdint.h и uint64_t, которые гарантированно не зависят от платформы и имеют ширину 64 бита.

Вы должны перепроверить вашу printf() документацию, например, в моем 64-битном OpenSuse-окне с gcc a long, а также long lont int имеют ширину 64 бита через sizeof(). Для их печати я использую:


printf(" %llx ",hexNumber)

3 голосов
/ 06 декабря 2011

10 шестнадцатеричных символов составляет всего 40 бит. long long int гарантированно должен быть не менее 64 бит, поэтому он подходит для вашего использования.

Проблема на самом деле в вашей строке формата printf - %lx - это правильная строка формата для unsigned long int, а не long long int. Чтобы напечатать long long int, вы должны использовать %lld - если вы хотите напечатать его в шестнадцатеричном формате, вы должны объявить его как unsigned long long int и использовать %llx.

1 голос
/ 05 декабря 2011

Вы сканируете и печатаете, используя% lx.

Как я понимаю, строки формата% lx - это long int, а не long long int.В зависимости от вашего оборудования вы можете получить только 32 бита для длинного целого.

Один из других парней предложил% llx для длинного длинного целого.Попробовать это не повредит.

0 голосов
/ 27 декабря 2017

тег отправляет код в шестнадцатеричном формате - 10 символов

Я уверен, что вы имеете в виду, что тег отправляет RFID в виде 10-символьной строки ASCII, ограниченной16 шестнадцатеричных цифр "

Я пытался сохранить это число в переменной long long int,

почему ?

int и его друзья - арифметические типы.Вы используете их для хранения значений, для которых вы планируете выполнять арифметику.Вы увеличиваете их, добавляете 73 к ним, сдвигаете их битами влево на 3, поразрядно ИЛИ или используете их в качестве индекса.

Но RFID - это просто имя .Вы не делаете ничего с этим именем, потому что это не имеет смысла.Вы бы не сказали "кермит лягушка" +8, или "мисс свинка" << 7, или "медвежонок"% 3.Так же и с RFID.Вы просто читаете RFID, сравниваете их, возможно, хэшируете их, и записываете их.Это неделимые, непостижимые строки «волшебного печенья» - это просто токены. </p>

Так что вы должны хранить их как строку.Мало того, что чтение его в int, а затем запись его обратно в строку из int приводит к двум ненужным преобразованиям, это семантически бессмысленно.

0 голосов
/ 05 декабря 2011

Введите число в единицах размера управления и сохраните его в виде строки. Таким образом, бесконечная длина.

...