在下面的代码中,变量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)
}
答案 0 :(得分:2)
在您的平台上看起来像,类型int
的变量存储在16位,而类型char
的变量存储在8位。
这并非总是会发生,因为C ++标准不能保证这些类型的大小。我根据代码和注释做出了假设。使用固定大小的数据类型(例如here中描述的数据类型)来确保这一假设始终成立。
int
和char
都是整数类型。从较大的整数类型转换为较小的整数类型(例如int
到char
)时,最高有效位将被丢弃,最低有效位将被保留(在这种情况下,您保留最后一个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十进制