битовый сдвиг разный результат в аналогичных программах
Вот одна программа
#include<stdio.h>
#include<stdlib.h>
int main()
{
unsigned char a=0x80;
printf("%dn",a<<1);
}
Выход выше 256
Теперь вот еще одна версия вышеуказанной программы
#include<stdio.h>
#include<stdlib.h>
int main()
{
unsigned char a=0x80;
a=a<<1;
printf("%dn",a);
}
Выход выше
0
Насколько я понимаю, я не вижу никакой разницы между ними?
то есть, почему вывод идет 256 в первой и 0 во второй программе, в чем разница в утверждениях в обеих?4 ответа:
Выражение
a << 1
имеет типint
в соответствии с правилами продвижения типа языка Си. В первой программе вы берете этотint
, который теперь имеет значение0x100
, и передаете его непосредственно вprintf()
, который работает, как и ожидалось.Во второй программе ваш
int
присваиваетсяunsigned char
, что приводит к усечению0x100
до0x00
.
На вашей платформе
unsigned char
имеет ширину всего 8 бит, поэтомуa << 1
смещает 1 из левого конца, когда вы назначаете его обратно узкомуa
. В вызовеprintf
, с другой стороны,a
сначала повышается до целого числа (которое шире, чем 8 бит на вашей платформе), и таким образом бит выживает.