4 / 4 / 1
Регистрация: 20.01.2010
Сообщений: 93
1

Приведение типов в выражениях

08.10.2013, 19:52. Показов 1340. Ответов 17
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Читаю сабжевую главу Шилдта, где поясняется как именно ведет себя компилятор (или правильней сказать C#?), когда в выражения (+,-,*,\ и т.д) встречаются переменные разных типов. например а+b, где a - uint, b - какой-нибудь др., тип , далее 2й аргумент приводится к 1му (в зависимости от правил языка). Все вроде понятно, НО! Возникает вопрос:
нужно ли зазубривать эти правила? (знать, что если 1я переменная принадлежит такому типу, а 2я такому, то...)
насколько часто их приходится использовать в программистской практике?
нельзя ли просто обходится в выражениях переменными одного типа, где это возможно?

Надеюсь, не сумбурно получилось) Спасибо заранее..
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.10.2013, 19:52
Ответы с готовыми решениями:

Не требуется приведение типов при умножении типов Byte
Читал тут книгу(Г. Шилдт, "Полный справочник по C#"), и нашел такое (ст. 77) Поскольку при...

Приведение типов
Добрый день. Столкнулся вот с такой строкой в коде ...

Приведение типов
Доброго времени суток! Прошу помощи с решением данного задания. Я пытался решить, но возникли...

Приведение типов
Здравствуйте, нужно написать функцию, которая принимает 2 параметре: указатель на произвольный тип...

17
Эксперт .NET
17437 / 12829 / 3361
Регистрация: 17.09.2011
Сообщений: 21,107
08.10.2013, 20:15 2
Зазубривать не надо — со временем будет восприниматься интуитивно, особенно при частом использовании.
А в случае чего и компилятор намекнет.

Единственное, что нужно запомнить на начальном этапе — это то, что результат арифметических операций над целыми числами — целое число: 1/2=0
1 / 2 + 3.0 = 3
1
4 / 4 / 1
Регистрация: 20.01.2010
Сообщений: 93
08.10.2013, 20:18  [ТС] 3
Цитата Сообщение от kolorotur Посмотреть сообщение
Зазубривать не надо — со временем будет восприниматься интуитивно, особенно при частом использовании.
А в случае чего и компилятор намекнет.

Единственное, что нужно запомнить на начальном этапе — это то, что результат арифметических операций над целыми числами — целое число: 1/2=0
1 / 2 + 3.0 = 3
ок, спасибо
0
Master of Orion
Эксперт .NET
6097 / 4953 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
08.10.2013, 20:22 4
sergIKO, правило просто: компилятор приводит к более общему типу. То есть если складываем short и int - будет int, а если int и double - будет double
0
Эксперт .NET
17437 / 12829 / 3361
Регистрация: 17.09.2011
Сообщений: 21,107
08.10.2013, 20:24 5
Цитата Сообщение от Psilon Посмотреть сообщение
компилятор приводит к более общему типу
Предвещаю следующий вопрос: что такое "более общий тип" и как определяется его "боляя общность"?
0
Master of Orion
Эксперт .NET
6097 / 4953 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
08.10.2013, 20:27 6
kolorotur, множество допустимых значений. Разве что с unsigned это непонятно как работает, но то что он приводится к знаковому понять
а) несложно
б) редко когда используется
0
4 / 4 / 1
Регистрация: 20.01.2010
Сообщений: 93
08.10.2013, 20:28  [ТС] 7
Не, ну господа, я же не совсем ку-ку Это значит имеет больший диапазон значений, так? Это я усвоил сразу.
Мне голову запудрили всякие правила-исключения, например: если один аргумент uint, а второй short,sbyte,int то рез-т будет long ... а если второй не short,sbyte,int, то будет uint. <----Вот такого рода мозгодробилки
0
Master of Orion
Эксперт .NET
6097 / 4953 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
08.10.2013, 20:35 8
sergIKO, ну а вы подумайте, какой должен быть тип, который гарантированно вместит в себя все возможные значения при такой сумме. Возьмем два крайних случая
  1. uint a = 0; int b = - 1;
    a+b = -1
  2. uint a = uint.MaxValue; int b = любое число > int.MinValue + 1, например 0
    a+b = uint.MaxValue
Вопрос: какой тип может вместить в себя uint.MaxValue, но является знаковым?

Вот вам и ответ, почему long
1
4 / 4 / 1
Регистрация: 20.01.2010
Сообщений: 93
08.10.2013, 20:43  [ТС] 9
Цитата Сообщение от Psilon Посмотреть сообщение
sergIKO, ну а вы подумайте, какой должен быть тип, который гарантированно вместит в себя все возможные значения при такой сумме. Возьмем два крайних случая
  1. uint a = 0; int b = - 1;
    a+b = -1
  2. uint a = uint.MaxValue; int b = любое число > int.MinValue + 1, например 0
    a+b = uint.MaxValue
Вопрос: какой тип может вместить в себя uint.MaxValue, но является знаковым?

Вот вам и ответ, почему long
Спасибо, вроде понял. Но боюсь, если я буду решать подобные задачи каждый раз дабы найти истину (не ту, что true ), будет не айс...
0
Нарушитель
99 / 33 / 10
Регистрация: 05.10.2013
Сообщений: 154
Записей в блоге: 1
08.10.2013, 23:57 10
Цитата Сообщение от sergIKO Посмотреть сообщение
Спасибо, вроде понял. Но боюсь, если я буду решать подобные задачи каждый раз дабы найти истину (не ту, что true ), будет не айс...
С Шилдтом особо не увлекайся. Он лишь дает тебе лопату, которой ты сможешь быстрее разгрести Рихтера. Про интерфейсы, индексацию объектов, абстрактные классы он оч непонятно написал, я только у Рихтера и Троелсена начинаю понимать что это на самом деле и как можно применить в жизни(НО без прочтения Шилдта я Рихтера вообще читать не мог, понимал только отдельные фразы). Про обобщения вообще не врубился, хотя перечитываю третий раз уже ((мож это я туп конечно, я не отрицают и такого исхода). Ничего прохого про него сказать не хочу, им разжеванно достаточно, но от некоторых вещей самооценка резко падает +)
Поэтому просто все что он пишет фиксирую у себя, без зубрежки, понимая что все его объяснения будут в других книгах ещё не раз опровергнуты.
0
Master of Orion
Эксперт .NET
6097 / 4953 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
09.10.2013, 00:11 11
petrolium, я рихтера так и не осилил. У него очень много воды и проработки не того, что надо. Это из разряда четырех томов Кнута - называется настолькой книгой программиста, а на деле никто не читал, потому что дохрена всего и не очень по делу. По крайней мере мне попадались книжки с большей плотностью полезной информации на страницу.
0
Эксперт .NET
17437 / 12829 / 3361
Регистрация: 17.09.2011
Сообщений: 21,107
09.10.2013, 01:14 12
Цитата Сообщение от Psilon Посмотреть сообщение
Это из разряда четырех томов Кнута - называется настолькой книгой программиста, а на деле никто не читал, потому что дохрена всего и не очень по делу.
Зря вы так на Кнута. В его "искусстве" как раз всё строго по делу и с минимумом воды (из воды там редкие вкрапления шуток. Довольно ехидных, надо заметить), но там больше уклон на математический анализ алгоритмов, нежели на программирование как таковое — достаточно глянуть на оглавление.

"If you think you're a really good programmer... read (Knuth's) Art of Computer Programming... You should definitely send me a résumé if you can read the whole thing."
— Bill Gates
Вольный перевод: "Если думаешь, что ты крутой программер — почитай "Искусство программирования" Кнута. Если осилишь полностью — смело засылай мне свое резюме".
0
Заблокирован
09.10.2013, 09:59 13
Цитата Сообщение от sergIKO Посмотреть сообщение
Читаю сабжевую главу Шилдта, где поясняется как именно ведет себя компилятор (или правильней сказать C#?), когда в выражения (+,-,*,\ и т.д) встречаются переменные разных типов. например а+b, где a - uint, b - какой-нибудь др., тип , далее 2й аргумент приводится к 1му (в зависимости от правил языка). Все вроде понятно, НО! Возникает вопрос:
нужно ли зазубривать эти правила? (знать, что если 1я переменная принадлежит такому типу, а 2я такому, то...)
насколько часто их приходится использовать в программистской практике?
нельзя ли просто обходится в выражениях переменными одного типа, где это возможно?

Надеюсь, не сумбурно получилось) Спасибо заранее..

Посмеялся.
Запомни 1, неявно приводятся всегда базовые типы в сторону расширения, - там где не будет потеря информации, и явно в обратном направлении.
2, все что меньше int (byte,short +u) -на самом деле int.
3 По умолчанию создаются литералы int, double.

Все остальные ответы можешь пропустить.
0
4 / 4 / 1
Регистрация: 20.01.2010
Сообщений: 93
09.10.2013, 20:09  [ТС] 14
Так стоп, я уже запутался. На основании всего вышесказанного усвоил следующее правило:
Выражение всегда будет приводится к тому типу, который может вместить в себя результат выполнения операции без потери информации.
Например, умножаем переменную типа byte = 200 на переменную типа int= 2 100 000 000 (специально выбрал близкое к максимальному значению). По идее результат должен иметь тип long, т.к. результат произведения двух переменных выйдет за пределы области значений для byte и int. Так?
Но почему, в результате выполнения нижеприведенной программы получается какое-то отрицательно значение??? (-906795008)

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
using System;
 
class ShowBits
{
    static void Main()
    {
        int i=2100000000;
        long rez;
        byte b= 200;
        rez = i * b;
        Console.WriteLine(rez);
    }
}
0
369 / 341 / 108
Регистрация: 12.02.2013
Сообщений: 653
09.10.2013, 20:22 15
sergIKO, в данном случае оба операнда продвигаются к типу int, в результате чего переполнение...
0
Заблокирован
09.10.2013, 20:31 16
C#
1
2
3
4
5
6
7
8
9
 int i = 2100000000;
            long rez;
            byte b = 200;
 
            checked
            {
                rez = i * b;
            };
            Console.Write(rez);
0
4 / 4 / 1
Регистрация: 20.01.2010
Сообщений: 93
09.10.2013, 20:33  [ТС] 17
Цитата Сообщение от _Mutex Посмотреть сообщение
C#
1
2
3
4
5
6
7
8
9
 int i = 2100000000;
            long rez;
            byte b = 200;
 
            checked
            {
                rez = i * b;
            };
            Console.Write(rez);
штоа?
0
Master of Orion
Эксперт .NET
6097 / 4953 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
09.10.2013, 21:43 18
sergIKO, если один операнд может быть без потери приведен к типу другого операнда, то результат будет этого типа. Если нет - тогда верно то, что было сказанно выше. В данном случае умножаются два int, в результате переполнения получаем отрицательное значение, Это отрицательное значение превращается в long и записывается куда нужно.
0
09.10.2013, 21:43
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.10.2013, 21:43
Помогаю со студенческими работами здесь

Приведение типов
Вопрос сугубо теоретический, если тут такое разрешено. Знания почерпнуты из книги Троелсен Э. -...

Приведение типов
Добрый день! Никак не могу сообразить возможно ли создать класс в котором есть переменная типа...

Приведение типов
Проблема с приведениями типов public abstract class A&lt;T&gt; where T : B{} public class...

Приведение типов
Здравствуйте. Сегодня впал в ступор когда увидел: double x = -1.8; int y = (int) x; а...

приведение типов
подскажите, что надо почитать, чтобы понять как происходит на пример усечение при приведении типов...

Приведение типов
Есть 2 класса, экземпляр одного из них передаётся в другой по ссылке: public B(Object a)...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru