Умножить Char и Int вместе в C
Вопрос
Сегодня я нашел следующее:
#include <stdio.h>
int main(){
char x = 255;
int z = ((int)x)*2;
printf("%d\n", z); //prints -2
return 0;
}
Так что в основном я получаю переполнение, потому что ограничение размера определяется операндами на правой стороне = знак ??
Почему не размещает его в Int, прежде чем умножить работу?
В этом случае я использую CHAR и INT, но если я использую «длинную» и «длинную длинную int» (C99), то я получаю подобное поведение. Обычно это рекомендуется проводить арифметику с операндами разных размеров?
Решение
char
Может быть либо подписан или без подписания, в зависимости от вашего компилятора.
В вашем случае, кажется, подписан, а 255 находится за пределами диапазона, он может представлять (вероятно, он может представлять только номера от -128 до 127).
Так что проблема возникает, когда вы назначаете 255 к вашему char
Переменная - это приводит к определенному внедрению значения, которое в вашем случае, кажется, является -1.
Когда вы умножаете -1 на 2, вы получаете -2. Нет тайны там. Отброс к (int)
ничего не делает - типы уже, чем int
всегда способствуют int
или unsigned int
Перед любыми расчетами выполнятся с ними.
Другие советы
Похоже, что CHAR подписан на вашей платформе. Итак char x = 255
эффективно такой же, как char x = -1
. Отказ Литые для INT не имеют значения.
Попробуйте изменить это на:
unsigned char x = 255;
Нет, вы не получаете переполнение на второй строке (умножение). Проблема в том, что ваш компилятор использует signed char
По умолчанию и 255 переполняются и будут означать -1. В основном вы инициализируете переменную x
со значением -1. Casting -1 для INT приведет к -1 (signed
Операнды получит знаки-расширенные в UPCACTS, тогда как unsigned
Операнды получат нулевой удлиненный).
Вы можете заставить char
быть unsigned
Добавляя unsigned
приставка:
unsigned char x = 255;
Другие ответы красиво объясняют, как ваш пример «работает», поэтому я не буду объяснять это снова.
Тем не менее, позвольте мне наблюдать, что если что вы хотите использовать, это «unsigned 8-битное целое число», просто используйте <stdint.h>
С. uint8_t
уже (и его 16, 32, 64 бит) и держаться подальше от всех char
с short
песок int
S в этом мире.