「重要なバイト」の数値があります。0または255の可能性があります。
これは0または-1を意味します。
一度に255を-1に変換する方法。
私には機能しない関数があります:
acc->x = ((raw_data[1]) << 8) | raw_data[0];
「重要なバイト」の数値があります。0または255の可能性があります。
これは0または-1を意味します。
一度に255を-1に変換する方法。
私には機能しない関数があります:
acc->x = ((raw_data[1]) << 8) | raw_data[0];
1 に設定された 8 番目のビットごとに負の値 (254 == -2) を意味すると仮定すると、符号付き型からの拡大変換を実行する必要があります。
int n = (signed char)somebyte;
それで
unsigned char rawdate[2] = ...;
int msbyte = (signed char)rawdata[1];
acc->x = (msbyte << 8) | (raw_data[0] & 0xFF);
何が必要かはわかりませんが、整数の算術変換のルールは次のとおりです。
整数が別の下位ビット整数に割り当てられている場合、データは切り捨てられます。
例:
struct A {
int c1 : 8;
unsigned c2 : 8;
} a;
int main()
{
short int i = 255; // right 8 bits containing all bits set
a.c1 = i; // or a.c1 = 255. casting not required.
a.c2 = i; // same as above.
// prints -1, 255
printf("c1: %d c2: %d\n", a.c1, a.c2);
i = 511; // 9 number of 1 bits
a.c1 = i; // left 9th bit will be truncated. casting not required.
a.c2 = i; // same as above
// prints -1, 255
printf("c1: %d c2: %d\n", a.c1, a.c2);
return 0;
}
符号付き 8 ビット整数 (または char) が上位ビット整数 (たとえば int) に割り当てられている場合、符号ビットがシフトされます。
元:
char c = 255; // which is -1
int i = c; // i is now -1. sign bit will be shifted to 32nd bit.