битовый сдвиг разный результат в аналогичных программах
Вот одна программа
#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 бит на вашей платформе), и таким образом бит выживает.