[英]How type conversion is done in the following code?
在下面的代碼中,變量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)
}
看起來在您的平台上, 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
。
從您的代碼中,我知道您的情況下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/
在您的代碼中:
整數速度= 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十進制
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.