2015-07-02 6 views
-1

ходу spec говорит:инструкции сдвига в Golang

<< left shift    integer << unsigned integer 

Что делать, если левая сторона тип uint8:

var x uint8 = 128 
fmt.Println(x << 8)  // it got 0, why ? 
fmt.Println(int(x)<<8) // it got 32768, sure 

Вопросы:

  1. когда х uint8 типа, почему нет ошибки компиляции?
  2. почему x << 8 получил результат 0

Для C/C++,

unsigned int a = 128; 
printf("%d",a << 8); // result is 32768. 

Может кто-нибудь объяснить? Спасибо.

+3

'uint8 (128) == 1000 0000' (двоичный). Вы сдвигаете это налево на 8 бит, это '1000 0000 0000 0000', из которых только последние 8 бит могут быть сохранены в' uint8', который равен '0000 0000', который равен 0. –

+2

Вы спрашиваете, почему '0' результат' x << 8'. Позвольте мне спросить, какой результат вы ожидали при использовании значения типа, максимальное значение которого «255»? – icza

ответ

0
  1. Потому что uint8 - это неподписанный 8-разрядный целочисленный тип. Вот что означает «u».

  2. Потому что uint8(128) << 8 сдвигает значение, превращая 1000 0000 в 0000 0000.

    int(x) делает 0000 0000 0000 0000 0000 0000 1000 0000 (на 32-битных системах, поскольку int зависит от архитектуры), а затем сдвиг приходит, что делает его 0000 0000 0000 0000 1000 0000 0000 0000 или 32768.

2

Оператор сдвига влево собирается смещать двоичные цифры в количестве влево X количество мест. Это имеет эффект добавления X число 0-й в правую часть числа А unit8 только держит 8 бит так, когда у вас есть 128 переменные имеют

x =   1000 0000 == 128 
x << 8 
x= 1000 0000 0000 0000 == 32768 

Поскольку uint8 содержит только 8 бит мы Tak крайних правые 8 бит, который является

x =   0000 0000 == 0 

причины вы получите правильный номер с int является int имеет, по меньшей мере, 16 бит хранения и, скорее всего, имеет 32 битые на вашей систему. Этого достаточно, чтобы сохранить весь результат.

+0

Он делает то, что говорит в названии, - сдвигает все биты влево. Добавление «0» является побочным продуктом, поскольку оно заполняет пространство «0». Если вы сдвигаетесь вправо на C++, он сохраняет бит знака, поэтому может добавить '1' или' 0'. –

Смежные вопросы