Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > Общие вопросы .NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.11.2010, 14:32   #1
vedro-compota
любитель-далеко не
Участник клуба
 
Аватар для vedro-compota
 
Регистрация: 13.04.2010
Сообщений: 1,156
Стрелка В чём разница в способах изменения типа данных?

Здравствуйте люди понимающие ))
Объясните пожалуйста - в чём разница ( принципиальная, ибо в первом случае компиль. ругается) между такими вот строчками -
Код:
 this.Value = (Int) ( Console.ReadLine());
и
Код:
 this.Value = Convert.ToInt16( Console.ReadLine());
при том что известно -
Код:
public int Value;
Заранее благодарю.)
против абортов=за + жизнь;.фкн вгу;_______________________мойблг
vedro-compota вне форума Ответить с цитированием
Старый 07.11.2010, 14:41   #2
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Console.ReadLine что возвращает? подумайте хорошенько.

Подсказка: 1 - приведение типов, 2 - преобразование типов.
BOBAH13 вне форума Ответить с цитированием
Старый 08.11.2010, 09:44   #3
vedro-compota
любитель-далеко не
Участник клуба
 
Аватар для vedro-compota
 
Регистрация: 13.04.2010
Сообщений: 1,156
По умолчанию

Цитата:
Вы должны выполнить явное преобразование, используя оператор приведения......
М
отсюда
да и в книге Шилдта как-то явно понятия путаются -
Код:
Преобразование типов в выражения 
b = 10;
b = (byte) (b * b) ; // Необходимо приведение типов!I
Console.WriteLine("b: "+ b) ;
-----------------------------------------
Приведение типов в выражениях

Console.WriteLine("Целая часть числа: {0}" ,
(int) Math.Sqrt(n));
Ничего не понятно), короче)
против абортов=за + жизнь;.фкн вгу;_______________________мойблг

Последний раз редактировалось vedro-compota; 08.11.2010 в 09:45. Причина: добавил
vedro-compota вне форума Ответить с цитированием
Старый 08.11.2010, 09:58   #4
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Цитата:
Сообщение от vedro-compota Посмотреть сообщение
М
отсюда
да и в книге Шилдта как-то явно понятия путаются -
Код:
Преобразование типов в выражения 
b = 10;
b = (byte) (b * b) ; // Необходимо приведение типов!I
Console.WriteLine("b: "+ b) ;
-----------------------------------------
Приведение типов в выражениях

Console.WriteLine("Целая часть числа: {0}" ,
(int) Math.Sqrt(n));
Ничего не понятно), короче)
Ну и? В чем собственно проблема? Вы не понимаете разницы между преобразованием(конвертирование) и приведением типов?
BOBAH13 вне форума Ответить с цитированием
Старый 10.11.2010, 19:13   #5
vedro-compota
любитель-далеко не
Участник клуба
 
Аватар для vedro-compota
 
Регистрация: 13.04.2010
Сообщений: 1,156
По умолчанию

Цитата:
не понимаете разницы между преобразованием(конвертирование) и приведением типов?
так точно )) даже мой препод в университетский как-то внятно не объяснил сказал - что вот это
Код:
(int) Math.Sqrt(n)
приведение (или преобразование -не суть важно по его словам) , а вот это -
Код:
 Convert.ToInt16( Console.ReadLine());
-
вообще не ни то ни другое это просто вызов метода класса -
то есть он не видит разницы между преобразованием и приведением, как , впрочем, и Шилдт - книжку которого рекомендовали для изучения разработчики NETфреймок из клана маленьких и мягких)
против абортов=за + жизнь;.фкн вгу;_______________________мойблг
vedro-compota вне форума Ответить с цитированием
Старый 10.11.2010, 19:19   #6
Casper-SC
Форумчанин
 
Регистрация: 04.07.2007
Сообщений: 549
По умолчанию

А что не понятного в строке:
Код:
            byte b = 10;
            b = (byte)(b * b); // Необходимо приведение типов!I
            Console.WriteLine("b: " + b);
После умножения 2-ух чисел типа byte они автоматом приводятся к типу int (Думаю понятно, что результат умножения практически любых числе получаются больше, чем может хранить тип byte). Там даже в редакторе кода подсказка, когда наводишь на умножение в скобках курсор мыши, показывается, что не удаётся неявно привести тип int к типу byte. Так как возможно переполнение, разработчики языка наверное и оставили право выбора программисту.

Тут метод вообще возвращает результат double и так как опять же возможна потеря данных, программист сам выполняет приведение.
Код:
            int n = 9;
            Console.WriteLine("Целая часть числа: {0}",
            (int)Math.Sqrt(n));

Последний раз редактировалось Casper-SC; 10.11.2010 в 19:22.
Casper-SC вне форума Ответить с цитированием
Старый 10.11.2010, 23:20   #7
m0nax
Форумчанин
 
Аватар для m0nax
 
Регистрация: 25.09.2009
Сообщений: 525
По умолчанию

vedro-compota внутри этого конверта очень много всего для разбора исходных данных(парсинг), в итоге вообще уходит в unsafe методы

Код:
     
/////Convert 
   public static short ToInt16(String value) { 
            if (value == null)
                return 0;
            return Int16.Parse(value, CultureInfo.CurrentCulture);
        } 


   /////Int16 
   private static short Parse(String s, NumberStyles style, NumberFormatInfo  info) {    	 

            int i = 0; 
            try {
                i = Number.ParseInt32(s, style, info);
            }
            catch(OverflowException e) { 
                throw new OverflowException(Environment.GetResourceString("Overflow_Int16"), e);
            } 
 
            // We need this check here since we don't allow signs to specified in hex numbers. So we fixup the result
            // for negative numbers 
            if ((style & NumberStyles.AllowHexSpecifier) != 0) { // We are parsing a hexadecimal number
                if ((i < 0) || (i > UInt16.MaxValue)) {
                    throw new OverflowException(Environment.GetResourceString("Overflow_Int16"));
                } 
                return (short)i;
            } 
 
            if (i < MinValue || i > MaxValue) throw new OverflowException(Environment.GetResourceString("Overflow_Int16"));
            return (short)i; 
        }

///// Number
        internal unsafe static Int32 ParseInt32(String s, NumberStyles style, NumberFormatInfo info) { 

            Byte * numberBufferBytes = stackalloc Byte[NumberBuffer.NumberBufferBytes];
            NumberBuffer number = new NumberBuffer(numberBufferBytes);
            Int32 i = 0; 

            StringToNumber(s, style, ref number, info, false); 
 
            if ((style & NumberStyles.AllowHexSpecifier) != 0) {
                if (!HexNumberToInt32(ref number, ref i)) { 
                    throw new OverflowException(Environment.GetResourceString("Overflow_Int32"));
                }
            }
            else { 
                if (!NumberToInt32(ref number, ref i)) {
                    throw new OverflowException(Environment.GetResourceString("Overflow_Int32")); 
                } 
            }
            return i; 
        }
и т.д

Последний раз редактировалось m0nax; 10.11.2010 в 23:22.
m0nax вне форума Ответить с цитированием
Старый 12.11.2010, 15:59   #8
vedro-compota
любитель-далеко не
Участник клуба
 
Аватар для vedro-compota
 
Регистрация: 13.04.2010
Сообщений: 1,156
По умолчанию

да так-то оно так (спасибо за примеры и пояснение особенностей!)только тезис Вована о различиях между приведением и преобразованием остаётся малопонятным)
против абортов=за + жизнь;.фкн вгу;_______________________мойблг
vedro-compota вне форума Ответить с цитированием
Старый 12.11.2010, 16:14   #9
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Приведение:

В памяти хранится int - 4 байта. Допустим это 0x00000034. 0x34 - char, или byte - 1 байт. 0x34 - это символ '4' соответствующий номеру в ASCII таблицы

Т.е. как получить из 4 байт, 1й символ '4' ?

int i = 0x00000034;
char s4 = (char)i; // т.е. мы запрашиваем младший байт
// s4 == '4';

Преобразование:

Есть строка char *s = "4"; По сути s это указатель на место в памяти где располагается 1 байт (ну не будем принимать во внимание Unicode...). Этот один байт есть никак иное что 0x34 (см. ранее)

Но если мы сделаем приведение типов то получим

int i4 = (int)(byte)*s; // разыменовываем указатель и получаем по адресу один char/byte, после чего приводим тип в int/4 байта.

В итоге i4 == 0x34; Что не правда, нам ведь надо 0x4;

Тут мы обязаны использовать преобразование, в самом простом случае, это i = ASCII Number - Symbol; т.е. i4 = (int)(byte)*s - 0x30 = 0x34 -0x30 = 0x4;

Думаю теперь ясна разница.
BOBAH13 вне форума Ответить с цитированием
Старый 21.11.2010, 20:49   #10
vedro-compota
любитель-далеко не
Участник клуба
 
Аватар для vedro-compota
 
Регистрация: 13.04.2010
Сообщений: 1,156
По умолчанию

Цитата:
Думаю теперь ясна разница.
теперь ясно , что преобразование связано со значимыми типами, а приведение со ссылочными......чтобы понять остальное надо понимать записи типа -
Код:
0x00000034
и их отношение к байтам ))
против абортов=за + жизнь;.фкн вгу;_______________________мойблг
vedro-compota вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
В чём разница между unit, header file, cpp file? TwiX Общие вопросы C/C++ 6 29.04.2012 19:49
В чём разница между запросами и программным обходом записей базы? Arkuz БД в Delphi 6 20.08.2009 16:19
В чём разница между TCP и UDP? TwiX Работа с сетью в Delphi 4 28.07.2009 23:54
в чём разница? Dimarik Общие вопросы C/C++ 1 25.04.2009 21:27
Ну тогда скажите здесь в чём разница...? Arkuz Общие вопросы Delphi 4 23.04.2008 21:58