Разница между расширением и сужением в C ++? - PullRequest
1 голос
/ 01 октября 2010

В чем разница между с расширением и сужением в c ++?Что подразумевается под кастингом и каковы типы кастингов?

Ответы [ 3 ]

6 голосов
/ 01 октября 2010

Это обычная вещь, не специфичная для C ++.

«Расширяющий» бросок - это приведение от одного типа к другому, где «целевой» тип имеет больший диапазон или точность, чем «исходный» (например, int для long, float для удвоения). «Сужающийся» бросок - полная противоположность (длинный до int). Сужение броска приводит к возможности переполнения.

Расширение приведения между встроенными примитивами является неявным, то есть вам не нужно указывать новый тип с помощью оператора приведения, если только вы не хотите, чтобы этот тип обрабатывался как более широкий тип во время вычисления. По умолчанию типы приводятся к самому широкому фактическому типу, используемому на стороне переменной двоичного выражения или присваивания, без учета каких-либо типов на другой стороне).

С другой стороны, сужение приведений должно выполняться явно, а исключения переполнения должны обрабатываться, если только код не помечен как не проверяемый на переполнение (ключевое слово в C # - unchecked; я не знаю, уникально ли оно на этот язык)

4 голосов
/ 01 октября 2010
Расширение

означает, что когда вы переходите от целого числа к двойному, вы повышаете точность приведения.

сужающее преобразование является обратной величиной, когда вы переходите от двойного к целому. Вы теряете точность

Существует два типа приведения: неявное и явное приведение. Страница ниже будет полезна. Кроме того, весь веб-сайт в значительной степени является потребностью в C / C ++.

Учебник по кастингу и конверсии

1 голос
/ 01 октября 2010

сдать домашний экзамен?: -)

Давайте сначала возьмем кастинг.Каждый объект в C или C ++ имеет тип , который представляет собой не что иное, как имя, которое дает два вида информации: сколько памяти занимает эта вещь и какие операции над ней можно выполнить.

То есть

 int i;

просто означает, что i относится к некоторому месту в памяти, обычно шириной 32 бита, для которого можно выполнить +,-,*,/,%,++,-- и некоторые другие.

Ciне очень требователен к этому, хотя:

 int * ip;

определяет другой тип, называемый указатель на целое число , который представляет адрес в памяти.У него есть дополнительная операция, префикс- *.На многих машинах также имеет ширину 32 бита.

A cast или typecast говорят компилятору обрабатывать память, определенную какодин тип, как если бы это был другой тип.Типы написаны как (typename).

Так что

 (int*) i;

означает «обрабатывать i как указатель», а

 (int) ip;

означает «обрабатывать»указатель ip как целое число.

Теперь в этом контексте расширение и сужение означают приведение к одному типу к другому, имеющему больше или меньше битсоответственно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...