我有一个包含两个元素的 uint8_t 数组:
uint8_t ui8[2]; // uint8_t array
ui8[0] = 70; // LSB
ui1[1] = 60; // MSB
Run Code Online (Sandbox Code Playgroud)
我想从这两个 uin8_t 值中获取一个 uint16_t 数字(不是数组)。我使用这种方法来得到这个结果:uint16_t ui16 = 6070
uint16_t ui16 = ui8[1] | (ui8[0] << 8);
Run Code Online (Sandbox Code Playgroud)
但我得到了 uint16_t ui16 = 15430;
使用错误的方法来获得我需要的东西吗?还是缺少什么?
也许您打算使用十六进制数字:
uint8_t ui8[2]; // uint8_t array
ui8[0] = 0x70; // LSB
ui1[1] = 0x60; // MSB
uint16_t ui16 = ui8[1] | (ui8[0] << 8);
printf("%x\n", ui16); // 7060
Run Code Online (Sandbox Code Playgroud)
如果要使用十进制数,则需要将“MSB”乘以 100 并相加。为此使用十进制数要少得多。
uint8_t ui8[2]; // uint8_t array
ui8[0] = 70; // LSB
ui1[1] = 60; // MSB
uint16_t ui16 = ui8[1] + (ui8[0] * 100);
printf("%d\n", ui16); // 7060
Run Code Online (Sandbox Code Playgroud)
请不要在这两种情况下,“70”将在“60”之前,因为您正在移动数组的第一个元素(70)。70 将是 MSB。
你也可以使用联合双关语:
#include <stdio.h>
#include <stdint.h>
typedef union {
uint8_t u8[2];
uint16_t u16;
}data16;
int main() {
data16 d16;
d16.u8[0] = 0x60;
d16.u8[1] = 0x70;
printf("%hx\n", d16.u16);
// it works in the opposite direction as well
// lets try to store 7060 decimal in two bytes
d16.u16 = 7060u;
printf("storing %hu decimal in two bytes: LSB:0x%0hhx (%hhu decimal), MSB:0x%0hhx (%hhu decimal)\n", d16.u16, d16.u8[0], d16.u8[0], d16.u8[1], d16.u8[1]);
return 0; }
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6064 次 |
| 最近记录: |