Как выполняется преобразование типов в следующем коде? - PullRequest
0 голосов
/ 29 апреля 2019

В приведенном ниже коде переменная Speed имеет тип int. Как он хранится в двух переменных типа char? Я также не понимаю комментарий // 16 bits - 2 x 8 bits variables.

Можете ли вы объяснить мне пример для преобразования типов, потому что когда я запускаю код, он показывает символы после преобразования типов

AX12A::turn(unsigned char ID, bool SIDE, int Speed)
{       
     if (SIDE == LEFT)
     {
        char Speed_H,Speed_L;
        Speed_H = Speed >> 8;
        Speed_L = Speed;     // 16 bits - 2 x 8 bits variables
     }
}

main(){
   ax12a.turn(ID,Left,200)
}

Ответы [ 2 ]

2 голосов
/ 29 апреля 2019

Это на вашей платформе выглядит как , переменная типа int хранится в 16 битах, а переменная типа char хранится в 8 битах.

Это не всегда происходит, так как стандарт C ++ не гарантирует размер этих типов. Я сделал свое предположение на основе кода и комментария. Используйте типы данных фиксированного размера, такие как описанные здесь , чтобы убедиться, что это предположение всегда будет верным.

И int, и char являются целочисленными типами. При преобразовании из большего целочисленного типа в меньший целочисленный тип (например, от int до char) старшие биты отбрасываются, а младшие биты сохраняются (в этом случае сохраняются последние 8 битов).

Прежде чем полностью понять код, вам также необходимо знать о сдвиге вправо. Это просто перемещает биты вправо (для целей этого ответа не имеет значения, что вставлено справа). Следовательно, младший значащий бит (самый правый бит) отбрасывается, каждый второй бит перемещается на один пробел вправо. Очень похоже на деление на 10 в десятичной системе.

Теперь у вас есть переменная Speed, которая имеет 16 битов.

Speed_H = Speed >> 8;

Это сдвигает Speed на 8 бит вправо, а затем присваивает 8 младших разрядов Speed_H. В основном это означает, что у вас будет в Speed_H 8 старших разрядов («верхняя» половина Speed).

Speed_L = Speed;

Просто присваивает Speed_L младшие 8 бит.

Комментарий в основном гласит, что вы разбили переменную из 16 битов на 2 переменные по 8 бит, причем первые (наиболее значимые) 8 битов были сохранены в Speed_H, а последние (наименее значимые) 8 битов были сохранены в Speed_L.

0 голосов
/ 30 апреля 2019

Из вашего кода я понимаю, что sizeof (int) = 2 байта в вашем случае.

Давайте рассмотрим пример, показанный ниже.

int my_var = 200;

my_var выделено 2 байта адреса памяти, потому что тип данных - "int".

значение, присвоенное my_var, равно 200.

Обратите внимание, что 200 десятичное = 0x00C8 шестнадцатеричное = 0000 0000 1100 1000 двоичное

Старший байт 0000 0000 хранится в одном из адресов, выделенных my_var А младший байт 1100 1000 хранится в другом адресе в зависимости от порядкового номера.

Чтобы узнать о порядке байтов, перейдите по этой ссылке

https://www.geeksforgeeks.org/little-and-big-endian-mystery/

В вашем коде:

int Speed ​​= 200;

Speed_H = Скорость >> 8;

=> 200 десятичное значение смещено вправо 8 раз

=> это означает, что 0000 0000 1100 1000 двоичное значение смещено вправо на 8 бит

=> это означает, что Speed_H = 0000 0000 двоичный файл

Speed_L = Скорость;

=> Speed_L = 200;

=> Speed_L = 0000 0000 1100 1000 двоичный

=> Speed_L имеет тип char, поэтому он может вместить только один байт

=> Значение 0000 0000 1100 1000 будет сужено (другими словами «отсечка») до младшего байта и присвоено Speed_L.

=> Speed_L = 1100 1000 двоичный = 200 десятичный

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...