Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ATmega AVR
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.62/13: Рейтинг темы: голосов - 13, средняя оценка - 4.62
1 / 1 / 1
Регистрация: 11.01.2016
Сообщений: 12
1

преобразовать 40-ка битное бинарное число не используя long long

11.01.2016, 16:51. Показов 2594. Ответов 25

Author24 — интернет-сервис помощи студентам
Доброго времени суток! Прошу помощи, не знаю как выкрутиться. Вся соль в том что long long не могу пользовать, так как CV AVR. Да и пошуршав интернеты оказалось что "экономичней" использовать массив из байтов (char). Собсно само число в двоичном виде я принимаю по 8бит * 5 раз (снимаю состояние ножек порта), потому мне показалось логичным использовать массив. Но! Как мне потом полученные данные перевести в десятичный вид и вывести на LCD. Как можно совершить преобразование без использования переменных более 32бит?

В плане вывести, мне что-то подсказывает, что можно просто string использовать. Как мне из бит получить мое огромное число?

Спасибо за внимание!
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.01.2016, 16:51
Ответы с готовыми решениями:

Требуется написать функцию long long pow(long long a, unsigned int p), которая возводит число a в степень p
Требуется написать функцию long long pow(long long a, unsigned int p), которая возводит число a в...

Как преобразовать const char * в long в С++, 0xE0E040BF в long
Помогите пожалуйста преобразовать текст в число на C++ const char * value=cmd; long ircode = ...

Как преобразовать char[8] к unsigned long long?
Требуется выполнить преобразование char к unsigned long long и обратно

Преобразовать FILETIME в обычный long long
Есть структура WIN32_FIND_DATAW там есть члены типа FILETIME. Они представляют собой файловый...

25
1976 / 1275 / 130
Регистрация: 04.01.2010
Сообщений: 4,607
11.01.2016, 21:34 2
... "в столбик".
Ну, то есть берем байты, от старшего к младшему, и делим их на "10" в столбик.

...чуть позже распишу пример.

Добавлено через 1 минуту
ЗЫ2: в Java есть класс (не помню точного имени), который использует мультибайтовые вычисления подобным образом. Вы можете поискать теоретически его исходники. Это мультибайтовая арифметика.
0
1 / 1 / 1
Регистрация: 11.01.2016
Сообщений: 12
11.01.2016, 22:02  [ТС] 3
Спасибо за наводку! Сейчас погуглим...
0
1976 / 1275 / 130
Регистрация: 04.01.2010
Сообщений: 4,607
11.01.2016, 23:08 4
нда... с пол-пинка разобраться не получится. Я расчитывал на тип "BigInteger" и его исходник... В методе ToString обычно происходит то что вам требуется. Но если честно, я уже так давно ковырялся в Java, что сразу не понял что в этом методе происходит.
0
1 / 1 / 1
Регистрация: 11.01.2016
Сообщений: 12
11.01.2016, 23:35  [ТС] 5
Ничего себе там коду... Спаси и сохрани!

Если эта задача нерешаема без совсем каких-то мудреных вещей, вы так и скажите. Может быть тогда стоит попытаться эту проблему не решить, а избавиться от нее? Не хотелось бы все переделывать под IAR, я в нем почти не разбираюсь, но если другого выхода нет... Там ведь Long Long есть, может под него есть какие-то встроенные методы для преобразования?
0
1976 / 1275 / 130
Регистрация: 04.01.2010
Сообщений: 4,607
11.01.2016, 23:41 6
Почитайте по поводу типов в доке к вашему CV AVR. Насколько мне помнится, он был, но глючил. Но возможно, для ваших задач его будет достаточно.
0
1 / 1 / 1
Регистрация: 11.01.2016
Сообщений: 12
12.01.2016, 00:49  [ТС] 7
В доке только до 32-х бит.

Наткнулся на их оф сайте в разделе "примеры" на вот такое "Example for the 64-bit integer mathematical functions.
Requires CodeVisionAVR V3.21 or later." Выходит что с версии 3.21 добавили поддержку 64 битных переменных. В самом примере что-то похожее есть... Может возможно скачать триалку новую, оттуда взять эту библиотеку с 64-битной математикой и себе на 3.12 прикрутить? Попробуем...

Собсно, сам пример с оф сайта:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
/****************************************************************
64-bit integer math library example.
 
(C) Copyright 2014-2015 Pavel Haiduc, HP InfoTech s.r.l.
[url]http://www.hpinfotech.com[/url]
 
This example is designed to run on an Arduino UNO
development board with an ATmega328P chip
clocked at 16 MHz.
 
The sensor output is transmitted serially at a
Baud rate of 9600, 8N1 and can be displayed using
the CodeVisionAVR IDE Tools|Terminal.
  
The program size exceeds the code size limit of the Evaluation
version.
In this case the pre-compiled executable from
\Examples\AVR\64-Bit Math\Release\Exe\64 bit math example.hex 
can be uploaded to the Arduino board.
****************************************************************/
 
// I/O registers definitions
#include <io.h>
// Standard I/O: printf
#include <stdio.h>
// 64-bit integer math functions
#include <math64.h>
 
char buf1[64];
char buf2[64];
char buf3[64];
 
void main(void)
{
// Initialize 64-bit variables during declaration
long64_t x=__INIT64(100000000000000LL);
long64_t y=__INIT64(2500);
 
long64_t z;
long q;
 
// USORT initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USORT Receiver: Off
// USORT Transmitter: On
// USORT0 Mode: Asynchronous
// USORT Baud Rate: 9600 @ 16 MHz
UCSR0A=(0<<RXC0) | (0<<TXC0) | (0<<UDRE0) | (0<<FE0) | (0<<DOR0) | (0<<UPE0) | (0<<U2X0) | (0<<MPCM0);
UCSR0B=(0<<RXCIE0) | (0<<TXCIE0) | (0<<UDRIE0) | (0<<RXEN0) | (1<<TXEN0) | (0<<UCSZ02) | (0<<RXB80) | (0<<TXB80);
UCSR0C=(0<<UMSEL01) | (0<<UMSEL00) | (0<<UPM01) | (0<<UPM00) | (0<<USBS0) | (1<<UCSZ01) | (1<<UCSZ00) | (0<<UCPOL0);
UBRR0H=0x00;
UBRR0L=0x67;
 
printf("64-bit integer math library example\r\n\r\n");
 
z=add64(x,y);
 
printf("Display result using 'printl64':\r\n");
printl64(x); // Output the 64-bit integer x in decimal format
printf(" + ");
printl64(y);
printf(" = ");
printl64(z);
printf("\r\n");
 
printf("Display result using 'ltoa64' and 'printf':\r\n");
ltoa64(x,buf1); // Convert the 64-bit integer x to decimal in buf1
ltoa64(y,buf2);
ltoa64(z,buf3);
printf("%s + %s = %s\r\n",buf1,buf2,buf3);
 
// The sqrt64 function returns an unsigned long
// so its result can be directly displayed by printf
printf("sqrt64(%s) = %lu\r\n",buf1,sqrt64(x));
 
// Assign a numeral to a long64_t variable
__EQU64(y,55); // y=55
 
// 64-bit multiplication
z=mul64(x,y);
ltoa64(x,buf1);
ltoa64(y,buf2);
ltoa64(z,buf3);
printf("%s * %s = %s\r\n",buf1,buf2,buf3);
 
__EQU64(y,5000000LL); // y=5000000LL
 
// 64-bit division
z=div64(x,y);
ltoa64(x,buf1);
ltoa64(y,buf2);
ltoa64(z,buf3);
printf("%s / %s = %s\r\n",buf1,buf2,buf3);
 
// 64-bit modulo
__EQU64(y,339); // y=339
z=mod64(x,y);
ltoa64(x,buf1);
ltoa64(y,buf2);
ltoa64(z,buf3);
printf("%s %% %s = %s\r\n",buf1,buf2,buf3);
 
// Assign a long64_t variable to another long64_t variable
y=z;
 
// 64-bit substraction
z=sub64(x,y);
ltoa64(x,buf1);
ltoa64(y,buf2);
ltoa64(z,buf3);
printf("%s - %s = %s\r\n",buf1,buf2,buf3);
 
// Display a hexadecimal number using
// ltox and printf
ltox64(z,buf1); // Convert the 64-bit integer x to hexadecimal in buf1
printf("%s = 0x%s\r\n",buf3,buf1);
 
// Display a hexadecimal number using printx64
printf("0x");
printx64(z); // Output the 64-bit integer z in hexadecimal format
printf(" = ");
printl64(z);
printf("\r\n");
 
// 64-bit arithmetic shift right
ltox64(z,buf1);
asr64(&z,16); // z=z>>16
ltox64(z,buf2);
printf("0x%s >> 16 = 0x%s\r\n",buf1,buf2);
 
// 64-bit logic negation
z=com64(z);
ltox64(z,buf1);
printf("~ 0x%s = 0x%s\r\n",buf2,buf1);
 
// 64-bit arithmetic negation
z=neg64(x);
ltoa64(x,buf1);
ltoa64(z,buf2);
printf("- (%s) = %s\r\n",buf1,buf2);
 
// 64-bit absolute value
x=abs64(z);
ltoa64(z,buf1);
ltoa64(x,buf2);
printf("abs64(%s) = %s\r\n",buf1,buf2);
 
// Assign 32-bit signed long to 64-bit long64_t
q=-1234567L;
x=tolong64(q);
ltoa64(x,buf1);
printf("Assign 32-bit signed long to 64-bit long64_t: %s\r\n",buf1);
 
// 64-bit increment
inc64(&x); // ++x
ltoa64(x,buf2);
printf("%s + 1= %s\r\n",buf1,buf2);
 
// Some complex calculations...
__EQU64(x,12345678900000LL); // x=12345678900000LL;
ltoa64(x,buf1);
__EQU64(y,55); // y=55;
ltoa64(y,buf2);
__EQU64(z,640000000000000000LL); // z=640000000000000000LL;
ltoa64(z,buf3);
printf("%s * %s + sqrt(%s) - 12345 = ",buf1,buf2,buf3);
// Note: sqrt64 returns a 32-bit long,
// so it must be converted to a 64-bit long64_t 
// expected by add64, using the tolong64 function
// The same applies to the 12345 16-bit integer that
// must be converted to 64-bit long64_t
// expected by the sub64 function
// z=x*y+sqrt(z)-12345
z=sub64(add64(mul64(x,y),tolong64(sqrt64(z))),tolong64(12345)); 
printl64(z);
printf("\r\n");
 
// Stop here
while (1);
}
Добавлено через 10 минут
А по какому вообще пути можно было бы пойти, если бы у меня было 32-х битное число? char array >лепим в кучу> string >переводим в десятичное число> long >превращаем в набор цифр> string >выводим цифры> lcd ?
0
Модератор
Эксперт по электронике
8909 / 6678 / 918
Регистрация: 14.02.2011
Сообщений: 23,524
12.01.2016, 06:18 8
andrey_k19, пошукай темы с именем "Длинная арифметика" в ветке Си и С++ их было много
насчет реализации, например для x86 мог бы подсказать двоично-десятичное представление числа, там для этого есть специальные ассемблерные команды, для AVR не помню, поддерживает ли евонный ассемблер эту фичу

Добавлено через 10 минут
Цитата Сообщение от andrey_k19 Посмотреть сообщение
char array >лепим в кучу> string
стринг лишннее, достаточно в массиве чар хранить в каждой ячейке число от 0 до 9, ну а дальше длинная арифметика
вот например одно из решений сложения
сложение поразрядное
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
char AddDec(char* buf1,char* buf2, char P, unsigned char N)
{
char p;
buf1[N]+=buf2[N]+P;
p=buf[N]/10;
buf1[N]%=10;
return p;
}
 
void Add(char * buf1,char* buf2,unsigned char Size)
{
 char p=0;
for(unsigned char i=0;i<Size;i++)
 p=AddDec(buf1,buf2,p,i);
 
}
1
1 / 1 / 1
Регистрация: 11.01.2016
Сообщений: 12
13.01.2016, 00:43  [ТС] 9
Спасибо за советы, но чет я так и не понял как мое большое 40ка битное число, хранящееся в виде пяти кусков по 8 бит перевести в одно целое десятичное число.

Начал исследования Atmel Studio 6. Там на long long не ругается. Буду пробовать все туда перенести. Может кто знает как в этой ситуации реализовать преобразование, так чтоб попроще? Как мне эти кусочки по 8 бит накидать в long long? Что-то типа:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <avr/io.h>
#include <stdint.h>
 
unsigned long long x;
unsigned long long b1,b2,b3,b4,b5;
 
int main(void)
{
    b1=0b01110101;
    b2=0b01100101;
    b3=0b01111101;
    b4=0b11110001;
    b5=0b01000101;
 
    x=(b5<<32)|(b4<<24)|(b3<<16)|(b2<<8)|(b1<<0); 
             
}
p.s. long long на кусочки дал потому что при сдвиге ругается если разные типы

И самое главное, как это большое число потом вывести на LCD? Это нужно сначала мой long long в string перевести, чтоб это был набор цифр? Или как?
0
Модератор
Эксперт по электронике
8909 / 6678 / 918
Регистрация: 14.02.2011
Сообщений: 23,524
13.01.2016, 01:41 10
Цитата Сообщение от andrey_k19 Посмотреть сообщение
но чет я так и не понял как мое большое 40ка битное число, хранящееся в виде пяти кусков по 8 бит перевести в одно целое десятичное число.
а не пробовал такую штуку,объединение называется
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
typedef union _MyVar
{
unsined cahar byte[8];
unsigned long long int  MyLong;
}MyVar;
 
MyVar var;
var.MyLong=0L;
var.byte[0]=0b01110101;
var.byte[1]=0b01100101;
var.byte[2]=0b01111101;
var.byte[3]=0b11110001;
var.byte[4]=0b01000101;
 
x=var.MyLong;
Цитата Сообщение от andrey_k19 Посмотреть сообщение
И самое главное, как это большое число потом вывести на LCD? Это нужно сначала мой long long в string перевести, чтоб это был набор цифр?
C
1
2
char  buf[16]={0};
sprintf(buf,"%ld",var.Mylong);
Добавлено через 2 минуты
Цитата Сообщение от andrey_k19 Посмотреть сообщение
long long на кусочки дал потому что при сдвиге ругается если разные типы
приводить надо
C
1
2
3
4
5
 x=((unsigned long long)b5<<32)|
((unsigned long long)b4<<24)|
((unsigned long long)b3<<16)|
((unsigned long long)b2<<8)|
((unsigned long long)b1<<0);
0
1 / 1 / 1
Регистрация: 11.01.2016
Сообщений: 12
13.01.2016, 02:08  [ТС] 11
Цитата Сообщение от ValeryS Посмотреть сообщение
а не пробовал такую штуку,объединение называется
я имел ввиду не имея доступа к long long, и вывести уже в десятичном виде нужно

Цитата Сообщение от ValeryS Посмотреть сообщение
приводить надо
а за вот это огромное спасибо! код этой пробной программки неплохо уменьшился, с 1,05кб до 0,7кб
0
Модератор
Эксперт по электронике
8909 / 6678 / 918
Регистрация: 14.02.2011
Сообщений: 23,524
13.01.2016, 06:31 12
Цитата Сообщение от andrey_k19 Посмотреть сообщение
я имел ввиду не имея доступа к long long, и вывести уже в десятичном виде нужно
объединение это такая штука, область памяти которую можешь интерпретировать как угодно
в данном случае это память из 8 байт, которой можно пользоваться как массивом чар, так и длинным инт
в отличии от сдвигов где ты выделяешь память под еще одну перемененную
вот вводишь байты, а преобразуешь в строку уже длинную инт
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
typedef union _MyVar
{
unsined cahar byte[8];
unsigned long long int  MyLong;
}MyVar;
 
MyVar var;
char  buf[16]={0};
 
var.MyLong=0L;
var.byte[0]=0b01110101;
var.byte[1]=0b01100101;
var.byte[2]=0b01111101;
var.byte[3]=0b11110001;
var.byte[4]=0b01000101;
 
sprintf(buf,"%ld",var.Mylong);
0
1976 / 1275 / 130
Регистрация: 04.01.2010
Сообщений: 4,607
13.01.2016, 09:39 13
ValeryS, сложность в том, что в каких-то версиях CV AVR нет нормальной поддержки типа long long. я сталкивался с такой проблемой, но ее получилось быстро решить двумя long'ами, переписал алгоритм. ТС'у в общем случае нужна математика, которая бы посчитала строчку в DEC из массива байт. Типа, вы имеете массив из трех байт: "FF FF FF" а на выходе имеете строчку: "16777215".
0
1 / 1 / 1
Регистрация: 11.01.2016
Сообщений: 12
13.01.2016, 11:17  [ТС] 14
Voland_, вы абсолютно правы. Единственное, в моем случае 5 байт.
0
Модератор
Эксперт по электронике
8909 / 6678 / 918
Регистрация: 14.02.2011
Сообщений: 23,524
13.01.2016, 13:19 15
Цитата Сообщение от Voland_ Посмотреть сообщение
ValeryS, сложность в том, что в каких-то версиях CV AVR нет нормальной поддержки типа long long.
я ориентируюсь на это
Цитата Сообщение от andrey_k19 Посмотреть сообщение
Начал исследования Atmel Studio 6. Там на long long не ругается.
Цитата Сообщение от Voland_ Посмотреть сообщение
ТС'у в общем случае нужна математика, которая бы посчитала строчку в DEC из массива байт. Типа, вы имеете массив из трех байт: "FF FF FF" а на выходе имеете строчку: "16777215".
так нужно знать какая математика, и зачем переводить в десятичку, только для вывода на экран? или еще что то делать? в общем неплохо бы ТЗ, что на входе,как обрабатываем, что на выходе
1
1 / 1 / 1
Регистрация: 11.01.2016
Сообщений: 12
13.01.2016, 22:16  [ТС] 16
ValeryS, на входе сигнал подаваемый на один порт, каждая ножка - один бит, пять раз снимаем состояние всех ножек и получаем 5 пачек по одному байту, все это вместе - одно большое число, в двоичном виде. Далее это число, уже в десятичном виде, нужно показать на LCD экранчике. МК атмега 8535.

Добавлено через 1 минуту
Цитата Сообщение от ValeryS Посмотреть сообщение
я ориентируюсь на это
немного сам уже запутался...

Добавлено через 2 часа 25 минут
Сделал вот так:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
unsigned long long num_read()
{
   unsigned char i=0, num_temp[5], num_adr[5]={0x15,0x16,0x17,0x18,0x19};
   unsigned long long num_all;
   
   while (i<5)
   {
       PORTA_OUT;
       PORTA=num_adr[i];
       WR_1;
       PORTA_IN;
       PORTA_CLR;
       RD_1;
       num_temp[i]=PORTA;
       RD_0;
       WR_0;
       i++;
   }
   
   num_all=((unsigned long long)num_temp[4]<<32)|
            ((unsigned long long)num_temp[3]<<24)|
            ((unsigned long long)num_temp[2]<<16)|
            ((unsigned long long)num_temp[1]<<8)|
            ((unsigned long long)num_temp[0]<<0);
   
   return num_all; 
}
Вопрос теперь в том, как long long в строку преобразовать для вывода. Пробовал sprintf, но он добавляет 5кб к размеру прошивки и тогда все не влазит. Пытаюсь найти какой-нить метод поскромнее. Буду благодарен, если кто-то подскажет экономный способ.

Добавлено через 1 час 54 минуты
Накопал вот такое чудо, но оно раза в два больше места чем sprintf занимает , а лимит 8кб вообще на все...
C
1
2
3
4
5
6
7
8
9
void uint64_to_string( unsigned long long value, char result[12] ) 
    {
    result=0;
    unsigned long long q = value;
    do {
        result += "0123456789"[ q % 10 ];
        q /= 10;
    } while ( q );
}
Добавлено через 2 часа 58 минут
В общем оказалось что заменить атмегу на другую, с памятью поболее, кил на 32/64 если что, можно. Так что главное чтоб заработало.
Буту пытаться через sprintf:
C
1
2
3
char str[14];
unsigned long long num;
sprintf(str, "%.13llu", num);
В этом туториале вычитал что можно добавить ".13" что будет означать, если цифр у меня будет меньше 13-ти, то sprintf добавит в начале еще нулей, чтоб общее количество знаков было 13. Это очень удобно для вывода. И по поводу llu не понятно, потянет ли или белиберду какую-то получу.

Но пока это все вилами по воде, компилятор-то компилит, а что оно на самом деле будет? Мож растеряется где-нить половина знаков или еще что. Затестить на железе получится не раньше следующей недели. Так что, если что отпишу. Мож кому пригодится. Если есть какие советы\критика, тоже рад буду.
0
ФедосеевПавел
13.01.2016, 22:40
  #17

Не по теме:

Может быть забыть о long long и врукопашную реализовать процедуру деления одного 5-тибайтового на другое путём вычитания (перед этим сделать процедуру вычитания). Это обычное дело для "длинной арифметики" или для вузовских упражнений по ассемблеру.
Для снижения количества циклов вычитания при делении, можно исходное число разделить на 10^6 (задать константой в виде массива). Потом частное и остаток разделить на 10^3 (опять константа в массиве), а потом и на 10.

И ещё. Моё жирное IMHO - человек не воспринимает больше 3 значащих цифр, а тут аж 13 (FF FF FF FF FF = 1'099'511'627'775). Поэтому, я также сомневаюсь в необходимости вывода на экран такого неинформативного числа.

0
1 / 1 / 1
Регистрация: 11.01.2016
Сообщений: 12
13.01.2016, 23:29  [ТС] 18
ФедосеевПавел, это уже сложная математика, я не силен. А по поводу неинформативности, нужно столько. Иначе не мучался бы изначально с этим.
0
Модератор
Эксперт по электронике
8909 / 6678 / 918
Регистрация: 14.02.2011
Сообщений: 23,524
14.01.2016, 06:02 19
andrey_k19, так у тебя есть доступ к long long или нет?
если есть то
вот так можешь перевести,
C
1
2
3
4
5
6
7
char buf[14];
for(int i=12;i>=0;i--)
{
  buf[i]=n%10+'0';
 n/=10;
}
 buf[13]=0;
строка на 13 символов, незначащие нули тоже будут выводится типа 0000000000002
и учти что деление на 10, если аппаратно не реализовано тоже может места занимать
0
1 / 1 / 1
Регистрация: 11.01.2016
Сообщений: 12
14.01.2016, 15:36  [ТС] 20
ValeryS, установил atmel studio 6.0, в ней есть поддержка long long. Судя по всему проще под студию все переделать, чем без long long'а обойтись.

Ваше решение добавляет 10кб, а sprintf 4кб с копейками. Но ваше решение интуитивно понятное и по идее точно должно работать, а со sprintf неизвестно, как он отработает long long. Короче в любом случае, на атмегу 8535 не влезет. Значит будем менять... Спасибо за процедурку!

Добавлено через 50 минут
Мне тут подсказали, попробовать олдскульные методы...
C
1
2
3
4
5
6
    unsigned char sdvig[12];
    sdvig[11]=((unsigned char)xxx);
    for (char i=10;i>=0;i--)
    {
        sdvig[i]=((unsigned char)xxx>>4);
    }
Типа циферки-то хранятся по 1 байту каждая, собсно по байту их и вытянуть. Не знаю как приведение сработает, может переполнение какое случится, и критично ли оно будет. Произойдет ли в моей конструкции передача самого младшего байта из xxx (он же long long) в sdvig (char)...

Ну а дальше, если что, то можно будет доплюсовать к каждому 30 или сколько там, по ASCII.

Что скажете, господа?
0
14.01.2016, 15:36
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.01.2016, 15:36
Помогаю со студенческими работами здесь

Создать программу используя условия long long
С оператором for

Не понятный undefined reference to `unsigned long long f<unsigned long long, void>
test.cpp: #include &lt;iostream&gt; template &lt;typename FormalType, typename FactType = typename...

как получается число 18446744073709551615 на unsigned long long?
Я возвожу 2ку в 64ую степень - https://umath.ru/calc/vozvedenie-chisla-v-stepen-onlajn/, выходит...

Вывести число типа long long int
Друзья! код взят у Стивена Праты &quot;программирование на языке C&quot; #include &lt;stdio.h&gt; int main () ...

Чем различаются long long и long double?
long long или long double

Образовать long число BCDABCDE, используя поразрядные операции
Помогите пожалуйста дописать программу :даны два int числа: N1 = ABCD и N2 = EFGH, где AB…GH – 16 –...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru