Умножение char и int вместе в C
сегодня я нашел следующее:
#include <stdio.h>
int main(){
char x = 255;
int z = ((int)x)*2;
printf("%dn", z); //prints -2
return 0;
}
Итак, в основном я получаю переполнение, потому что ограничение размера определяется операндами с правой стороны знака=??
почему не бросает его в int перед умножением работы?
в этом случае я использую char и int, но если я использую "long" и "long long int" (c99), то я получаю аналогичное поведение. Обычно рекомендуется не делать арифметику с операндами разных размеров?
4 ответов
char
может быть signed или unsigned, в зависимости от вашего компилятора.
в вашем случае он кажется подписанным, и 255 находится вне диапазона, который он может представлять (вероятно, он может представлять только числа от -128 до 127).
таким образом, проблема возникает, когда вы назначаете 255 вашему char
variable-это приводит к определенному реализацией значению, которое в вашем случае кажется -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. Приведение -1 к int приведет к -1 (signed
операндов будет иметь знак в приводит, тогда как unsigned
операнды получат нулевое расширение).
можно char
на unsigned
добавить unsigned
префикс:
unsigned char x = 255;
другие ответы красиво объясняют, как ваш пример "работает", поэтому я не буду объяснять это снова.
однако позвольте мне заметить, что если вы хотите использовать "беззнаковое 8-битное целое число", просто используйте <stdint.h>
' s uint8_t
уже (и его 16, 32, 64-битные компаньоны) и держитесь подальше от всех char
s,short
s и int
в этом мире.