2017-01-22 4 views
3
#include <stdio.h> 
#include <stdint.h> 
typedef unsigned char  uint8_t; 
typedef short    int16_t; 
typedef unsigned short  uint16_t; 
typedef int     int32_t; 
typedef unsigned int  uint32_t; 
int main(){ 
    uint8_t ball; 
    uint8_t fool; 
    ball=((unsigned char)13); 
    fool=((unsigned char)14); 
    uint16_t combined_value1=((uint16_t)ball)<<12+((uint16_t)fool)<<8; // WRONG ONE 
    uint16_t combined_value2=((uint16_t)ball<<12)+((uint16_t)fool<<8); 
    printf("%hu\n",(uint16_t)combined_value1); 
    printf("%hu\n",(uint16_t)combined_value2); 
    return 0; 
} 

Почему значение "combined_value1" не так ли? Здесь шарик и дурак принимают значение от 0 до 15, и я пытаюсь объединить комбинированное значение как {ball [4 bits]: fool [4 bits]: [8 zero bits]}.Тип литья и бит Манипуляции Тайна

+1

Вы знаете, что ваши typedefs, возможно, конфликтуют с 'stdint.h', правильно? Фактически, вся точка заголовка устраняет typedefs, как те, которые вы добавили. – StoryTeller

ответ

5

+ имеет более высокую precedence чем <<, так

((uint16_t)ball)<<12+((uint16_t)fool)<<8; 

оценивается как

((uint16_t)ball) << (12+((uint16_t)fool)) << 8; 

Пожалуйста, обратите внимание, что (uint16_t) литье не имеет особого смысла в этом контексте, так как после этого продвижения к int принимает место. Вместо этого рассмотрите

uint16_t combined_value = (uint16_t)((ball<<12) + (fool<<8)); 

Есть также несколько других избыточных отливок. А так как @StoryTeller предложил, было бы лучше включить stdint.h.

+1

Ссылка на таблицу [Приоритет Оператора ** **] (http://www.difranco.net/compsci/C_Operator_Precedence_Table.htm) может дать немного больше информации, чтобы помочь не только с '+' и '<< ', но со всеми операторами в будущем. –

+0

@ DavidC.Rankin Спасибо, я добавил ссылку на сообщение тоже. – AlexD

+0

Это хороший ответ, но я всегда стараюсь дать направление вопроса к ссылке, которая позволит ему решить проблему самостоятельно в следующий раз, когда он встретится с ней. (старый «Дайте человеку рыбу, накормите его на день. Научите человека ловить рыбу, кормить его на всю жизнь ... аналогию). Спасибо за добавление. –