Умножение 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-битные компаньоны) и держитесь подальше от всех chars,shorts и intв этом мире.