【问题标题】:How type conversion is done in the following code?下面的代码是如何进行类型转换的?
【发布时间】:2019-04-29 17:42:04
【问题描述】:

在下面的代码中,变量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)
}

【问题讨论】:

标签: c++ embedded


【解决方案1】:

看起来在您的平台上,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 位存储在 @ 987654337@.

【讨论】:

  • 你能用类型转换的例子解释一下吗,因为当我运行代码时,它会在类型转换后显示符号
  • 这是预期的,因为变量是char,默认情况下显示为字符。打印时,将其打印为十进制(最简单的方法是打印(int)Speed_L 而不是Speed_L。但十进制值可能对理解发生的事情没有那么有用。十六进制会更有用。如果你用十六进制,您可能有类似 A1C2 for Speed 之类的东西,它分为 A1 和 C2。
【解决方案2】:

从您的代码中,我了解到在您的情况下 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 = 速度;

=> 速度_L = 200;

=> Speed_L = 0000 0000 1100 1000 二进制

=> Speed_L 是 char 类型,所以它只能容纳一个字节

=> 值 0000 0000 1100 1000 将缩小(即“截止”)到最低有效字节并分配给 Speed_L。

=> Speed_L = 1100 1000 二进制 = 200 十进制

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多