2015-04-23 36 views
3

我读2个字节,它们一起建立一个unsigned short值,从0到65536。我希望将它们组合到单个值组合两个无符号字节到一个整数值,所以这里我做了什么:使用左移位和按位或

int32_t temp; 
uint8_t buffer[2]; 

............. 
temp = (buffer[1] << 8) /* [MSByte]*/| (buffer[0]/* [LSByte]*/); 

printf (" %d" ,temp) ; 

我仍然在32767溢出。任何想法为什么?

+1

如何'Buffer'声明? –

+0

不清楚你在问什么,也不知道你在做什么。 – Lundin

+0

@iharob我已经添加了缓冲的声明你的答案 – Engine

回答

3

角色字节到变速前INT,即:

((int32_t)buffer[1] << 8) | buffer[0] 

P.S. 2个字节可以存储无符号整数值,范围为[0,65535];您提到的65536的值超出范围。


完整的测试程序 - 尝试不同的字节值buffer

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

int main() 
{ 
//uint8_t buffer[2] = {255, 0 }; // prints 255 
//uint8_t buffer[2] = {255, 127}; // prints 32767 
    uint8_t buffer[2] = {255, 255}; // prints 65535 

    int32_t temp = ((int32_t)buffer[1] << 8) | buffer[0]; 

    printf("%d", temp); 
} 
+0

感谢,但我仍然有溢出 – Engine

+1

@Engine,编辑测试代码加入到证明它的作品 –

+2

@Engine我看来,像在'了'%D' printf'导致问题,因为'%d'是用于'int',但你的'int'似乎是'int16_t'。尝试C99格式'printf(PRIi32,temp)'? http://en.cppreference.com/w/c/types/整数 – user3528438