Речь идёт об обычных арифметических операциях, но в ситуации, когда операнд представляет собой число, содержащее шестнадцатеричные цифры в мантиссе. Вариант, когда порядок содержит шестнадцатеричные цифры, расмотрен в разделе по косвенной адресации.
Для простоты рассмотрим ситуации, когда число состоит из одной шестнадцатеричной цифры. Далее будем её обозначать буквой H. Для более ясного порядка операндов будем использовать стандартные обозначения X и Y. Цифра F убрана из рассмотрения как опасная, по крайней мере в качестве первой цифры.
Y∖H | A | B | C | D | E |
---|---|---|---|---|---|
0 | 0 | 1 | 2 | 3 | 4 |
1 | 1 | 2 | 3 | 4 | 5 |
2 | 2 | 3 | 4 | 5 | 0 |
3 | 3 | 4 | 5 | 0 | 1 |
4 | 4 | 5 | 0 | 1 | 2 |
5 | 5 | 0 | 1 | 2 | 3 |
6 | 0 | 1 | 2 | 3 | 4 |
7 | 1 | 2 | 3 | 4 | 5 |
8 | 2 | 3 | 4 | 5 | 6 |
9 | 3 | 4 | 5 | 6 | 7 |
A | 4 | 5 | 6 | 7 | 8 |
B | 5 | 6 | 7 | 8 | 9 |
C | 6 | 7 | 8 | 9 | 10 |
D | 7 | 8 | 9 | 10 | 11 |
E | 8 | 9 | 10 | 11 | 12 |
10 | 10 | 21 | 22 | 24 | 24 |
11 | 21 | 22 | 23 | 24 | 25 |
12 | 22 | 23 | 24 | 25 | 26 |
13 | 23 | 24 | 25 | 26 | 27 |
14 | 24 | 25 | 26 | 27 | 28 |
15 | 25 | 26 | 27 | 28 | 29 |
16 | 26 | 27 | 28 | 29 | 30 |
17 | 27 | 28 | 29 | 30 | 31 |
18 | 28 | 29 | 30 | 31 | 32 |
19 | 29 | 30 | 31 | 32 | 33 |
1A | 30 | 31 | 32 | 33 | 34 |
1B | 31 | 32 | 33 | 34 | 35 |
1C | 32 | 33 | 34 | 35 | 20 |
1D | 33 | 34 | 35 | 20 | 21 |
1E | 34 | 35 | 20 | 21 | 22 |
1F | 35 | 20 | 21 | 22 | 23 |
Вычисление идёт как шестнадцатеричное, остаток по модулю 16, а от
него берётся последняя цифра.
X = ((X + Y) mod 16) mod 10.
Если Y двузначное, то уже две цифры X = ((X + Y) mod 256)
mod 100, а значит получается как
обычное сложение, если число двузначное.
Если Y дробное, то целая часть как выше,
а дробная сохраняется.
В этом случае осуществляется обычное сложение, только результат нормализуется. Например: 0 + A = 10, 9 + E = 23. В случае шестнадцатеричного X см. таблицу выше.
Y∖H | A | B | C | D | E |
---|---|---|---|---|---|
0 | −10 | −1 | −2 | −3 | −4 |
1 | −9 | −10 | −1 | −2 | −3 |
2 | −8 | −9 | −10 | −1 | −2 |
3 | −7 | −8 | −9 | −10 | −1 |
4 | −6 | −7 | −8 | −9 | −10 |
5 | −5 | −6 | −7 | −8 | −9 |
6 | −4 | −5 | −6 | −7 | −8 |
7 | −3 | −4 | −5 | −6 | −7 |
8 | −2 | −3 | −4 | −5 | −6 |
9 | −1 | −2 | −3 | −4 | −5 |
A | 0 | −1 | −2 | −3 | −4 |
B | 1 | 0 | −1 | −2 | −3 |
C | 2 | 1 | 0 | −1 | −2 |
D | 3 | 2 | 1 | 0 | −1 |
E | 4 | 3 | 2 | 1 | 0 |
10 | 0 | 15 | 14 | 13 | 12 |
11 | 1 | 16 | 15 | 14 | 13 |
12 | 2 | 17 | 16 | 15 | 14 |
13 | 3 | 18 | 17 | 16 | 15 |
14 | 4 | 19 | 18 | 17 | 16 |
15 | 5 | 20 | 19 | 18 | 17 |
16 | 6 | 21 | 20 | 19 | 18 |
17 | 7 | 22 | 21 | 20 | 19 |
18 | 8 | 23 | 22 | 21 | 20 |
19 | 9 | 24 | 23 | 22 | 21 |
1A | 0 | 25 | 24 | 23 | 22 |
1B | 1 | 10 | 25 | 24 | 23 |
1C | 2 | 11 | 10 | 25 | 24 |
1D | 3 | 12 | 11 | 10 | 25 |
1E | 4 | 13 | 12 | 11 | 10 |
1F | 5 | 14 | 13 | 12 | 11 |
Выглядит похоже на X = (Y − X) mod 16, но не всегда понятно,
когда
берётся заём, а когда нет. Число A какое-то особенное для двузначных,
для него повторяется как для однозначных, т. е. только с последней
цифрой идёт операция, а потом складывается.
Для трёх- и выше значных повторяется как для двузначных,
т. е. 100 − A = 90, т. е. 90 + (10 − A) + 0,
100 − B = 105, т. е. 90 + (10 − B) + 0,…,
109 − E = 111, т. е. 90 + (10 − E) + 9.
X∖H | A | B | C | D | E |
---|---|---|---|---|---|
0 | 10 | 11 | 12 | 13 | 14 |
1 | 9 | 0 | 1 | 2 | 3 |
2 | 8 | 9 | 0 | 1 | 2 |
3 | 7 | 8 | 9 | 0 | 1 |
4 | 6 | 7 | 8 | 9 | 0 |
5 | 5 | 6 | 7 | 8 | 9 |
6 | 4 | 5 | 6 | 7 | 8 |
7 | 3 | 4 | 5 | 6 | 7 |
8 | 2 | 3 | 4 | 5 | 6 |
9 | 1 | 2 | 3 | 4 | 5 |
A | 0 | 1 | 2 | 3 | 4 |
B | −1 | 0 | 1 | 2 | 3 |
C | −2 | −1 | 0 | 1 | 2 |
D | −3 | −2 | −1 | 0 | 1 |
E | −4 | −3 | −2 | −1 | 0 |
10 | 0 | 1 | 2 | 3 | 4 |
11 | −1 | 0 | 1 | 2 | 3 |
12 | −2 | −1 | 0 | 1 | 2 |
13 | −3 | −2 | −1 | 0 | 1 |
14 | −4 | −3 | −2 | −1 | 0 |
15 | −5 | −4 | −3 | −2 | −1 |
16 | −6 | −5 | −4 | −3 | −2 |
17 | −7 | −6 | −5 | −4 | −3 |
18 | −8 | −7 | −6 | −5 | −4 |
19 | −9 | −8 | −7 | −6 | −5 |
1A | −10 | −9 | −8 | −7 | −6 |
1B | −1 | −10 | −9 | −8 | −7 |
1C | −2 | −1 | −10 | −9 | −8 |
1D | −3 | −2 | −1 | −10 | −9 |
1E | −4 | −3 | −2 | −1 | −10 |
1F | −5 | −4 | −3 | −2 | −1 |
Нарушения обычного вычитания только для нескольких чисел, выше и
правее, начиная с B − 1, для двузначных ниже и левее A − 1B.
Кстати, особенность: когда из шестнадцатеричного числа вычитается
его десятичный аналог, то ноль, на самом деле, ненормализованный.
Т. е. из 4-х значного будет 0000. И это можно использовать
для получения нуля в любой степени. Пример в ручном режиме:
И вот мы получили 0. 99.
Y∖H | A | B | C | D | E |
---|---|---|---|---|---|
0 | 0 | 0 | 0 | 0 | 0 |
1 | 10 | 10 | 10 | 10 | 0 |
2 | 20 | 20 | 20 | 20 | 0 |
3 | 30 | 30 | 30 | 30 | 0 |
4 | 40 | 40 | 40 | 40 | 0 |
5 | 50 | 50 | 50 | 50 | 0 |
6 | 60 | 60 | 60 | 60 | 0 |
7 | 70 | 70 | 70 | 70 | 0 |
8 | 80 | 80 | 80 | 80 | 0 |
9 | 90 | 90 | 90 | 90 | 0 |
A | 00 | 00 | 00 | 00 | 0 |
B | 10 | 10 | 10 | 10 | 0 |
C | 20 | 20 | 20 | 20 | 0 |
D | 30 | 30 | 30 | 30 | 0 |
E | 40 | 40 | 40 | 40 | 0 |
10 | 100 | 100 | 100 | 100 | 0 |
11 | 110 | 110 | 110 | 110 | 0 |
12 | 120 | 120 | 120 | 120 | 0 |
13 | 130 | 130 | 130 | 130 | 0 |
14 | 140 | 140 | 140 | 140 | 0 |
15 | 150 | 150 | 150 | 150 | 0 |
16 | 160 | 160 | 160 | 160 | 0 |
17 | 170 | 170 | 170 | 170 | 0 |
18 | 180 | 180 | 180 | 180 | 0 |
19 | 190 | 190 | 190 | 190 | 0 |
1A | 200 | 200 | 200 | 200 | 0 |
1B | 210 | 210 | 210 | 210 | 0 |
1C | 220 | 220 | 220 | 220 | 0 |
1D | 230 | 230 | 230 | 230 | 0 |
1E | 240 | 240 | 240 | 240 | 0 |
1F | 250 | 250 | 250 | 250 | 0 |
Поразительное однообразие, почти все ведут себя как 10. Не ясно, чем
так отличается E, но ноль получается и для многозначных чисел.
Для двузначных соответственно, т. е. C × 20 = 200,
но E × 20 = 0.
X∖H | A | B | C | D | E |
---|---|---|---|---|---|
0 | 0 | 0 | 0 | 0 | 0 |
1 | 0 | 1 | 2 | 3 | 4 |
2 | 4 | 6 | 8 | 10 | 12 |
3 | 4 | 1 | 4 | 23 | 10 |
4 | 8 | 2 | 0 | 20 | 24 |
5 | 50 | 11 | 32 | 53 | 42 |
6 | 0 | 22 | 44 | 50 | 40 |
7 | 10 | 33 | 40 | 63 | 54 |
8 | 20 | 44 | 52 | 60 | 68 |
9 | 30 | 55 | 64 | 73 | 82 |
A | 00 | 10 | 20 | 30 | 40 |
B | 00 | 10 | 20 | 30 | 40 |
C | 00 | 10 | 20 | 30 | 40 |
D | 00 | 10 | 20 | 30 | 40 |
E | 0 | 0 | 0 | 0 | 0 |
10 | 00 | 10 | 20 | 30 | 40 |
11 | 10 | 21 | 32 | 43 | 54 |
12 | 04 | 16 | 28 | 40 | 52 |
13 | 14 | 11 | 24 | 53 | 50 |
14 | 08 | 22 | 20 | 50 | 4 |
15 | 990 | 021 | 052 | 923 | 922 |
16 | 000 | 032 | 904 | 920 | 920 |
17 | 010 | 043 | 900 | 933 | 934 |
18 | 020 | 054 | 912 | 930 | 948 |
19 | 030 | 905 | 924 | 943 | 962 |
1A | 940 | 960 | 980 | 0 | 20 |
1B | 940 | 960 | 980 | 0 | 20 |
1C | 940 | 960 | 980 | 0 | 20 |
1D | 940 | 960 | 980 | 0 | 20 |
1E | 00 | 10 | 20 | 30 | 40 |
1F | 00 | 10 | 20 | 30 | 40 |
Тут уже трудно поддаётся логике. На практике автор как-то использовал D. С одной стороны, это изображение, с другой – коэффициент 10: см. таблицу H × Y. А самое основное – это проверка битового сдвига. При умножении дробной части, содержащей 1, 2, 4, 8, как бы биты, возможен выход за диапазон, т. е. 0.5 или 1.6. Так вот, при умножении на D по указанной таблице, результат из одной цифры получался, если всё нормально, или из двух, при выходе за диапазон.
Для двухзначных результат бывает ненормализованным: обратите внимание на ведущие нули в некоторых случаях. На этом фоне 14 × E выглядит как белая ворона.
X∖H | A | B | C | D | E |
---|---|---|---|---|---|
0 | ЕГГ0Г | ЕГГ0Г | ЕГГ0Г | ЕГГ0Г | ЕГГ0Г |
1 | 0 | 1 | 2 | 3 | 4 |
2 | 5 | 5.5 | 6 | 6.5 | 7 |
3 | 3.3333333 | 3.6666666 | 4 | 4.3333333 | 4.6666666 |
4 | 2.5 | 2.75 | 3 | 3.25 | 3.5 |
5 | 2 | 2.2 | 2.4 | 2.6 | 2.8 |
6 | 1.6666666 | 1.8333333 | 2 | 2.1666666 | 2.3333333 |
7 | 1.4285714 | 1.5714285 | 1.7142857 | 1.8571428 | 2 |
8 | 1.25 | 1.375 | 1.5 | 1.625 | 1.75 |
9 | 1.1111111 | 1.2222222 | 1.3333333 | 1.4444444 | 1.5555555 |
A | 1 | 1.1 | 1.2 | 1.3 | 1.4 |
B | 8.4444443|−01 | 1 | 1.2525252 | 1.3434343 | 1.4343434 |
C | ЕГГ0Г | ЕГГ0Г | 1 | 1.23 | 1.3 |
D | 4.|−01 | 6.|−01 | 8.|−01 | 1 | 1.2 |
E | 5.2929292|−01 | 2.2929292|−01 | 5.2929292|−0 | 8.2929292|−01 | 1 |
10 | 0.|−01 | 1.|−01 | 2.|−01 | 3.|−01 | 4.|−01 |
11 | 9.090909|−01 | 0.|−01 | 0.9090909|−01 | 1.8181818|−01 | 2.7272727|−01 |
12 | 8.3333333|−01 | 9.1666666|−01 | 0.|−01 | 0.8333333|−01 | 1.6666666|−01 |
13 | 7.6923076|−01 | 8.4615384|−01 | 9.2307692|−01 | 0.|−01 | 0.7692307|−01 |
14 | 7.1428571|−01 | 7.8571428|−01 | 8.5714285|−01 | 9.2857142|−01 | 0.|−01 |
15 | 6.6666666|−01 | 7.3333333|−01 | 8.|−01 | 8.6666666|−01 | 9.3333333|−01 |
16 | 6.25|−01 | 6.875|−01 | 7.5|−01 | 8.125|−01 | 8.75|−01 |
17 | 5.8823529|−01 | 6.4705882|−01 | 7.0588235|−01 | 7.6470588|−01 | 8.2352941|−01 |
18 | 5.5555555|−01 | 6.1111111|−01 | 6.6666666|−01 | 7.2222222|−01 | 7.7777777|−01 |
19 | 5.2631578|−01 | 5.7894736|−01 | 6.3157894|−01 | 6.8421052|−01 | 7.368421|−01 |
1A | 5.|−01 | 5.1|−01 | 6.3157894|−01 | 6.1|−01 | 7.|−01 |
1B | 5.0330001|−01 | 6.|−01 | 7.0001032|−01 | 7.8330001|−01 | 8.2330001|−01 |
1C | 6.|−01 | 7.0003809|−01 | 7.8100038|−01 | 8.1810003|−01 | 8.100038|−01 |
1D | 7.0005899|−01 | 7.9000589|−01 | 8.|−01 | 9.0005899|−01 | 9.9000589|−01 |
1E | 5.64|−01 | 5.90002|−01 | 6.4|−01 | 6.60002|−01 | 7.24|−01 |
1F | 5.4000299|−01 | 5.3223099|−01 | 6.153223|−01 | 7.0002999|−01 | 7.7000299|−01 |
Здесь кроме случая X = 1, и некоторых двузначных это обычное
деление нормализованного шестнадцатеричного числа. Пример:
E ÷ 7 = 14 ÷ 7 = 2.
Правда и здесь встречаются ненормализованные числа,
пример D ÷ 12, или C ÷ 11, которое на порядок меньше,
чем A ÷ 11.
Встречаются и ненормализованные нули, пример: С ÷ 12, и
выглядит, как указано:
0. -01.
Впрочем, в косвенной адресации мы
уже встречались с подобными нулями.
Y∖H | A | B | C | D | E |
---|---|---|---|---|---|
0 | 9.090909|−01 | 9.9099099|−01 | 4.4444443 | 9.9099099|−01 | 9.9099099|−01 |
1 | ЕГГ0Г | 9.099099|−01 | 9.9099099|−01 | 9.9099099|−01 | 9.9099099|−01 |
2 | ЕГГ0Г | 8.4444443|−01 | 9.099099|−01 | 9.9099099|−01 | 9.9099099|−01 |
3 | ЕГГ0Г | 6.4444443|−01 | ЕГГ0Г | 9.099099|−01 | 9.9099099|−01 |
4 | ЕГГ0Г | 4.4444443|−01 | ЕГГ0Г | 8.|−01 | 9.099099|−01 |
5 | ЕГГ0Г | 2.4444443|−01 | ЕГГ0Г | 0.|−01 | 2.929292|−02 |
6 | ЕГГ0Г | 6.4444443|−01 | ЕГГ0Г | 2.|−01 | 3.2929292|−01 |
7 | ЕГГ0Г | 4.4444443|−01 | ЕГГ0Г | 4.|−01 | 6.2929292|−01 |
8 | ЕГГ0Г | 2.4444443|−01 | ЕГГ0Г | 0 | 9.2929292|−01 |
9 | ЕГГ0Г | 0.4444443|−01 | ЕГГ0Г | 2.|−01 | 2.2929292|−01 |
A | 1 | 8.4444443|−01 | ЕГГ0Г | 4.|−01 | 5.2929292|−01 |
B | 1.1 | 1 | ЕГГ0Г | 6.|−01 | 2.2929292|−01 |
C | 1.2 | 1.2525252 | 1 | 8.|−01 | 5.2929292|−01 |
D | 1.3 | 1.3434343 | 1.23 | 1 | 8.2929292|−01 |
E | 1.4 | 1.4343434 | 1.3 | 1.2 | 1 |
10 | ЕГГ0Г | 9.09909 | 9.9099099 | 9.9099099 | 9.9099099 |
11 | ЕГГ0Г | 9.099099 | ЕГГ0Г | 9.8 | 9.0292929 |
12 | ЕГГ0Г | 9.099099 | ЕГГ0Г | 0 | 9.3292929 |
13 | ЕГГ0Г | 9.099099 | ЕГГ0Г | 0.2 | 9.6292929 |
14 | ЕГГ0Г | 9.099099 | ЕГГ0Г | 0.4 | 9.9292929 |
15 | ЕГГ0Г | 9 | ЕГГ0Г | 9 | 0.22922929 |
16 | ЕГГ0Г | 9.2525252 | ЕГГ0Г | 9.2 | 0.5292929 |
17 | ЕГГ0Г | 9.3434343 | ЕГГ0Г | 9.4 | 9.2292929 |
18 | ЕГГ0Г | 9.4343434 | ЕГГ0Г | 9.6 | 9.5292929 |
19 | ЕГГ0Г | 9.5252525 | ЕГГ0Г | 9.8 | 9.8292929 |
1A | ЕГГ0Г | 9.6 | 9.9909909 | 9.9909909 | 9.9909909 |
1B | ЕГГ0Г | 9.8525252 | 9.9909909 | 9.9909909 | 9.9909909 |
1C | ЕГГ0Г | 9.9434343 | 9.9909909 | 9.9909909 | 9.9909909 |
1D | ЕГГ0Г | 0.0343434 | 9.9909909 | 9.9909909 | 9.9909909 |
1E | ЕГГ0Г | 9.099099 | 9.9909909 | 9.9909909 | 9.9909909 |
1F | ЕГГ0Г | 7.4444443 | 9.9909909 | 9.9909909 | 9.9909909 |
Тут логики не наблюдается. Очень похожие, но разные числа:
9.099099|−01 и 9.9099099|−01, или 9.099099 и 9.9099099.
Также интересно, что при делении нуля на шестнадцатеричную цифру получается вовсе не ноль.
А самое главное, тут не просто ЕГГ0Г,
а плохой ЕГГ0Г,
который ранее не встречался. После его появления ПМК и в дальнейшем
до выключения ПМК при выполнении многих операций
всегда выдаёт ЕГГ0Г. Вот список таких операций:
+, −, ×, ÷, ←→, Fsin, Fcos, Ftg, F√, F1/x, Fsin-1, Fcos-1, Ftg-1, Fπ, Fx2, Fex, Flg, Fln, Fxy, F10x, F↻.
Ошибка возникает как в режиме вычислений, так и в программном режиме. Интересно, что F↻ выдаёт ошибку, а FВx – нет.
Синие
функции работают нормально.
Видимо такой ЕГГ0Г сводит с ума
только один микроконтроллер.
F(H)∖H | A | B | C | D | E |
---|---|---|---|---|---|
Fx2 | 00 | 10 | 20 | 30 | 0 |
F√ | 3.1622776 | 3.3166247 | 3.4641016 | 3.6055512 | 3.7416573 |
F1/x | ЕГГ0Г | 9.099099|−01 | 9.9099099|−01 | 9.9099099|−01 | 9.9099099|−01 |
Fex | 22026.467 | 59874.133 | 162754.78 | 442413.37 | 1202604.3 |
F10x | 1.|+10 | 1.|+0B | 1.|+0C | 1.|+0D | 1.|+0E |
Flg | 1 | 41.823681 | 42.40274 | 42.816354 | 43.126564 |
Fln | 2.3025851 | 96.302585 | 97.635918 | 98.588299 | 99.302585 |
Fx¹ | 10 | 6.6631773|+41 | 2.5277867|+42 | 6.551706|+42 | 1.3383338|+43 |
К[x] | 0 | 1 | 2 | 3 | 4 |
Про более редкие операции переводов градусов/часов сказано в приложении по командам. Числа, где порядок содержит шестнадцатеричные значения, рассмотрены в разделе косвенной адресации порядок содержит шестнадцатеричные цифры.
Практическое применение – это получение нестандартного результата, как отличие от обычной цифры. Или получение нестандартной последовательности. Или как был приведен выше по умножению.
Случаи с двойными и более шестнадцатеричными числами, в том числе в дробной части, не рассмотрены, как очень редко встречающиеся. Там тоже можно построить подобные таблицы, но проще посмотреть результат под конкретное число.