Умножение 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в этом мире.