在以下代码中如何进行类型转换?

时间:2019-04-29 17:42:05

标签: c++ embedded

在下面的代码中,变量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 个答案:

答案 0 :(得分:2)

在您的平台上看起来像,类型int的变量存储在16位,而类型char的变量存储在8位。

这并非总是会发生,因为C ++标准不能保证这些类型的大小。我根据代码和注释做出了假设。使用固定大小的数据类型(例如here中描述的数据类型)来确保这一假设始终成立。

intchar都是整数类型。从较大的整数类型转换为较小的整数类型(例如intchar)时,最高有效位将被丢弃,最低有效位将被保留(在这种情况下,您保留最后一个8位)。

在完全理解代码之前,您还需要了解右移。这只是将位向右移动(就此答案而言,向右插入什么都无所谓)。因此,最低有效位(最右边的位)被丢弃,每隔一位向右移动一位。十分类似于十进制中的10除。

现在,您有了变量Speed,它具有16位。

Speed_H = Speed >> 8;

此操作将Speed向右移动8位,然后将8个最低有效位分配给Speed_H。这基本上意味着您将在Speed_H中拥有8个最高有效位(Speed的“上半部”)。

Speed_L = Speed;

简单地将最低有效8位分配给Speed_L

该注释基本上表明您将16位变量分成2个8位变量,其中前一个(最高有效)8位存储在Speed_H中,最后一个(最低有效)8位存储在在Speed_L中。

答案 1 :(得分:0)

根据您的代码,我了解到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速度= 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十进制