• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

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

    Запись на курс до 25 апреля. Получить промодоступ ...

Непонятное выражение

  • Автор темы Yalud
  • Дата начала
Статус
Закрыто для дальнейших ответов.
Y

Yalud

Приведу пример элементарного кода:

int a;
int b;
a=10;
b=(float)a;

Объясните, каков смысл имеет выражение b=(float)a; При этом в результате эксперементов выяснилось, что вместо типа float, может стоять char, int и подозреваю другие типы. В результате b всегда равен 10, а его тип не может измениться, т.к он определен ранее. Данное выражение не похоже на обращение к функции. Выражение определено во встроенной библеотеке, там же где определены классы int, char и другие фундаментальные классы. В описание языка C++ я не нашел никакого объяснения. Выражение не подходит не под одно определение языка C++. Кто знает смысл поясните!!!
 
E

European

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

Kmet

Well-known member
25.05.2006
904
8
BIT
0
<!--QuoteBegin-Yalud+18:01:2007, 06:11 -->
<span class="vbquote">(Yalud @ 18:01:2007, 06:11 )</span><!--QuoteEBegin-->В описание языка C++ я не нашел никакого объяснения. Выражение не подходит не под одно определение языка C++.
[snapback]53544" rel="nofollow" target="_blank[/snapback]​
[/quote]
нет слов
 
Y

Yalud


Да возможно я малоинформирован по данной теме. Видимо в большинстве учебников данный вариант преобразования не описывается, т.к. думают, что такой элементарный пример не требует внимания ,в силу своей простоты для понимания и его смысл и так всем ясен(возможно я немного преувеличиваю!).

Но согласитесь если вглядется в детали данного выражения можно сделать вывод, что дополнение (float) является лишьним. Если я пытаюсь переменной скажем Int присвоить переменную char, то ежу понятно что это можно сделать только приведя один тип к другому, либо никак. Зачем же дополнительно приписывать к переменной аргумент float (я даже не знаю как правильно это называется аргумент, атрибут, оператор, тип или еще что). Понятное дело вы скажете что просто таковы правила языка и мы должны их выполнять, а если не нравится, то разработай свой язык и делай там что хочешь. Но факт наличия лишней информации в инструкции сразу ввел меня в заблуждение, почему я и решил разобратся в деталях. (На самом деле я до сих пор сомневаюсь, что эта информация лишьняя, просто ее смысл до сих пор не раскрыт)

Если вам все досконально понятно, как в таком случае вы объясните следующий пример:

int a;
char b;
b='y';
a=(float)b;

Что в этом коде происходит? (Компилятор все инструкции пропускает не ругаясь)
У меня три варианта:
1) Переменной a типа int присваивается значение переменной b типа char(с приведением ее к типу int) тогда возникает вопрос при чем здесь (float)
2) Переменной a типа int присваивается значение переменной b типа char(с приведением ее к типу float)
в этом случае вопрос? Как переменной типа int можно присвоить значение переменной типа float? Абсурд!
3) Переменной a типа int присваивается значение переменной b типа float(c приведением ее к типу int) Но компилятору то при этом хорошо известно, что переменная b определена ранее с типом char.

Если можно поясните что происходит с переменными на битовом(байтовом уровне).
 
Z

zubr

Происходит вот что:
Переменная a - 4-байтная, а переменная b - однобайтная, значит после присвоения a=b, значение переменной b загружается в младший байт переменной a. Если до присвоения переменная a==0, то после присвоения обе переменные будут иметь одно значение, в противном случае разные.
Что касается приведения типа к float, это нужно, чтобы компилятор знал, что при дальнейших операциях с переменной a, надо обращаться как с вещественным числом. К примеру, если a оставить целочисленным числом и выполнить деление этого числа на другое целочисленное число, то результат компилятор тоже сделает целочисленным (без остатка от деления), хотя на самом деле он может быть вещественным. В случае приведения типа результат будет - вещественное число.
 
Y

Yalud

Спасибо, теперь я начинаю понимать. По сути переменная a меняет свой тип с int на float. Мое заблуждение было в том, что я считал, что тип переменной не может меняться по ходу программы. А если бы переменная a в вышеприведенном примере была бы определена как char , я бы в итоге получил однобайтную переменную типа float ?
 
E

European

<!--QuoteBegin-Yalud+19:01:2007, 07:27 -->
<span class="vbquote">(Yalud @ 19:01:2007, 07:27 )</span><!--QuoteEBegin-->По сути переменная a меняет свой тип с int на float. Мое заблуждение было в том, что я считал, что тип переменной не может меняться по ходу программы.
[snapback]53650" rel="nofollow" target="_blank[/snapback]​
[/quote]
А тип переменной и не может менятся! Меняется формат представления ее значения
 
Y

Yalud

А тип переменной и не может менятся! Меняется формат представления ее значения
Данное обстоятельство опять вносит путаницу в мое сознание. Выходит мы можем получить переменную типа char с форматом представления данных типа float. Тогда получается тип переменной говорит только о ее размере в байтах.
А когда мы определяем переменную например таким способом :
int a;
мы сообщаем компилятору, что у нас есть переменная с размером 4 байта(тип int), и форматом представления как целочисленная (формат int). При этом тип(размер) переменной по ходу программы изменить нельзя, а ее формат можно. Думаю в этом есть смысл.
 

Kmet

Well-known member
25.05.2006
904
8
BIT
0
Происходит вот что:
Переменная a - 4-байтная, а переменная b - однобайтная, значит после присвоения a=b, значение переменной b загружается в младший байт переменной a. Если до присвоения переменная a==0, то после присвоения обе переменные будут иметь одно значение, в противном случае разные.

int a;
char b;
a=b;

a==b вне зависимости от начального значения a, компилятор просто дополнит b до нужного размера.

Или я чего не понимаю?=(
 
Y

Yalud

На сколько я понял. формат представления данных у int и char одинаковый( называется целочисленный) единственное различие в размере переменных int - 4 байта(диапазон значений от -2147483648 до 2147483647) char - 1 байт(диапазон значений от -128 до 127). При присвоении a=b один единственный байт переменной b скопируется в младший байт переменной a, при этом оставшиеся байты переменной a останутся без изменения(они вполне могут быть ненулевыми) по этому никто не горантирует, что a==b. Именно это писал Zubr немного выше, если я правильно понял.
 

Kmet

Well-known member
25.05.2006
904
8
BIT
0
Я отлично понял, что имел ввиду Zubr. Просто считаю, что он ошибается, видимо ввиду раннего времени(или очень позднего :) ) ответа.
 
Z

zubr

Да, признаюсь, с присвоением a=b был не прав.
 
Статус
Закрыто для дальнейших ответов.
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!