簡體   English   中英

如何轉換為按位移位

[英]How to cast for bitwise shift

我正在嘗試將不同 16 位寄存器中讀取的位組合成一個帶有位移的 32 位變量(這是為了在傳感器上以一種有趣的方式將 ID 存儲在不同的寄存器中)。

但是我應該缺少一些關於鑄造和位移的東西。 特別是我無法理解為什么在下面的示例中sumid0_d + id1_d會導致不同的結果。 我更喜歡一種解決方案,例如無需聲明中間變量即可計算sum的方式。

#include <stdio.h>
#include <stdint.h>

int main(void) {
    uint16_t id0 = 0x4E00;
    uint16_t id1 = 0xABCD;
    uint32_t sum = ((uint32_t)id0)>>7 + ((uint32_t)id1)<<9;
    uint32_t id0_d = ((uint32_t)id0)>>7;
    uint32_t id1_d = ((uint32_t)id1)<<9;
    
    printf("id0: %04X\n", id0);
    printf("id1: %04X\n", id1);
    printf("sum: %08lx\n", sum);
    printf("id0_d: %08lx\n", id0_d);
    printf("id1_d: %08lx\n", id1_d);
    printf("id0+1_d: %08lx\n", id0_d + id1_d);
    return 0;
}

輸出以下內容:

id0: 4E00
id1: ABCD
sum: 00000000
     ^no the expected result
id0_d: 0000009c
id1_d: 01579a00
id0+1_d: 01579a9c
         ^expected result for "sum"

編輯以下內容:

uint32_t sum = ((uint32_t)id0)>>7 + ((uint32_t)id1)<<9;
uint32_t id0_d = ((uint32_t)id0)>>7;
uint32_t id1_d = ((uint32_t)id1)<<9;

到:確保操作以正確的順序執行:

uint32_t sum = ((uint32_t)id0>>7) | ((uint32_t)id1<<9);
uint32_t id0_d = (uint32_t)id0>>7;
uint32_t id1_d = (uint32_t)id1<<9;

在此示例中使用算術運算符+將產生預期結果,但對於按位運算,按位| 比較常用

printf("id0+1_d: %08lx\n", id0_d + id1_d);

printf("id0+1_d: %08lx\n", id0_d | id1_d);

這將導致預期的 output:

在此處輸入圖像描述

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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