что такое char i = 0x80 и почему переполнение не происходит при сдвиге битов - PullRequest
9 голосов
/ 18 июня 2011

Вот программа

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

Выход составляет 256. Я не совсем понимаю, что означает

unsigned char i=0x80; <-- i is not int it is char so what will it store?

Я знаю битовые сдвиги и шестнадцатеричные значения.Как сохраняется значение i и как оно изменяется на 256?

ОБНОВЛЕНИЕ

Почему переполнение не произошло, когда произошла операция сдвига битов?

Ответы [ 5 ]

18 голосов
/ 18 июня 2011

В C char - это целочисленный тип, используемый для хранения символьных данных, обычно 1 байт.

Значение, хранящееся в i, равно 0x80 шестнадцатеричной константе, равной 128.

Арифметическая операция над двумя целочисленными типами (например, i << 1) будет преобразована в более широкий тип, в данном случае в int, поскольку 1 является константой int. В любом случае целочисленные аргументы функции переводятся в int.

Затем вы отправляете результат на printf с указателем формата %d, что означает «напечатать целое число».

3 голосов
/ 18 июня 2011

Я думаю, что у K & R есть лучший ответ на этот вопрос:

2.7. Преобразования типов Когда оператор имеет операнды разных типов, они конвертируются в общий тип согласно небольшому количеству правил. В общем, единственный автоматический преобразования - это преобразования narrower'' operand into a шире '' один без потери информации, такой как преобразование целого числа в плавающее указать в выражении, как F + I. Выражения, которые не имеют смысла, как использование поплавка в качестве индекса, неразрешенный. Выражения, которые могут потерять информацию, как назначение более длинный целочисленный тип или более короткий Тип с плавающей точкой в ​​целое число, может сделать предупреждение, но они не незаконным. Чарс это просто маленький целое число, поэтому символы могут быть свободно использованы в арифметических выражениях.

Таким образом, i << 1 преобразует i в int до его смещения. Кен Ванерлинде понял это правильно. </p>

1 голос
/ 18 июня 2011

0x80 является шестнадцатеричным для 128.Операция x << 1 означает сдвиг влево на единицу, который эффективно умножает число на два, и в результате получается 256.

0 голосов
/ 13 июня 2014

i << 1 не сохраняется в i.Таким образом, не возникает вопроса о переполнении и выводе 256. </p>

Следующий код выдаст 0 в качестве вывода.

#include <stdio.h>
main()
{ 
    unsigned char i=0x80;
    i = i<<1;
    printf("i=%d",i);
}
0 голосов
/ 18 июня 2011

i=0x80 сохраняет шестнадцатеричное значение 0x80 в i.0x80 == 128.

При печати значения в операторе формата printf() значение, переданное в оператор * printf(), равно i<<1.

Оператор << являетсяУнарный битовый оператор смещения влево, который перемещает биты в i влево на одну позицию.

128 в двоичном виде - это «10000000», смещение этого значения в бит вправо дает «100000000» или 256.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...