2011-12-10 176 views
1

我有一個數字是「有效字節」,它可能是0或者255,它可能是0或者說255.二進制補碼stm32 c

這意味着0或-1。

如何一次性將255轉換爲-1。

我有一個功能,不工作對我來說:

acc->x = ((raw_data[1]) << 8) | raw_data[0]; 

回答

2

假設設置爲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); 
+0

這似乎對我來說http://pastebin.com/uGaM29b4 – SevenDays

+2

不,它必須是'(符號字符)'因爲標準允許'char'是不起作用無論是簽名還是未簽名。 –

+0

非常感謝你!現在它工作。 – SevenDays

1

我沒有確定需要什麼,但這裏是整數算術轉換的規則。

如果將整數分配給另一個較低位整數,則數據將被截斷。

實施例:

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位整數(或字符)被分配到更高位的整數(比如INT),它的符號位將被轉移。

例如:

char c = 255; // which is -1 
int i = c; // i is now -1. sign bit will be shifted to 32nd bit. 
+0

這個問題被標記爲C,而不是C++。 –

+0

好的,謝謝你展示我的錯誤。我會修改答案。 –

+0

謝謝,你的前任。也幫助我。 – SevenDays