Вопрос

Сегодня я нашел следующее:

#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песок intS в этом мире.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top