簡體   English   中英

在以下代碼中如何進行類型轉換?

[英]How type conversion is done in the following code?

在下面的代碼中,變量Speedint類型。 如何將其存儲在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 ++標准不能保證這些類型的大小。 我根據代碼和注釋做出了假設。 使用固定大小的數據類型(例如此處描述的數據類型),以確保這種假設總是正確的。

intchar都是整數類型。 從較大的整數類型轉換為較小的整數類型(例如intchar )時,將丟棄最高有效位,並保留最低有效位(在這種情況下,將保留最后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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM