Максимальное значение неподписанного символа - PullRequest
8 голосов
/ 30 июля 2010
#include <stdio.h>
int main()
{
    unsigned char i=0x80;
    printf("%d",i<<1);
    return 0;
}

Почему эта программа печатает 256?

Насколько я понимаю, так как 0x80 = 0b10000000, а беззнаковый символ имеет 8 битов, «1» должно переполниться после сдвига влево, и выходной сигнал должен быть 0, а не 256.

Ответы [ 2 ]

14 голосов
/ 30 июля 2010

Это результат целочисленных правил продвижения C.По сути, большинство любых переменных, входящих в выражение, «продвигаются», так что подобные операции не теряют точности.Затем он передается как int в printf, в соответствии с правилами переменных аргументов C.

Если вы хотите получить то, что ищете, вам придется вернуться к unsigned char:

#include <stdio.h>
int main()
{
    unsigned char i=0x80;
    printf("%d",((unsigned char)(i<<1)));
    return 0;
}

Примечание: использование %c, как указано в комментарии Стивена, не будет работать, потому что %c также ожидает целое число.

РЕДАКТИРОВАТЬ: В качестве альтернативы, вы можете сделать это:

#include <stdio.h>
int main()
{
    unsigned char i=0x80;
    unsigned char res = i<<1;
    printf("%d",res);
    return 0;
}

или

#include <stdio.h>
int main()
{
    unsigned char i=0x80;
    printf("%d",(i<<1) & 0xFF);
    return 0;
}
0 голосов
/ 30 июля 2010

Не забудьте формат специально для печати без знака.

printf("%u",(unsigned char)(i<<1));
...