2353 / 1771 / 212
Регистрация: 07.01.2011
Сообщений: 10,342
1

Не требуется приведение типов при умножении типов Byte

22.09.2014, 22:55. Показов 1467. Ответов 8
Метки нет (Все метки)

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

Поскольку при умножении, например, 2 чисел типа byte, результат будет приведен к int, то надо вручну привести тип, и там такой пример
C#
1
2
byte b = 10;
b = (byte) (b*b);//ручное приведение типа от результата int к byte
А тепер вопрос
C#
1
2
byte b = 10;
b *= b;//никакого приведения типа не требуеться, компилиться и без него, и результат акой же, как и у (byte) (b*b), т.е. 100
Почему так?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.09.2014, 22:55
Ответы с готовыми решениями:

Приведение типов Byte в Int
Перевожу число в byte получается 00 00 80 3f - 1 как перевести из byte обратно в инт? float one...

Приведение типов при десериализации класса
Помогите пожалуйста разобраться в стопорной проблеме! Я использую BinaryFormatter для сериализации...

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

Приведение типов
Здравствуйте, дамы и господа, наверное я совсем чего-то не понимаю, но вот такой элементарный...

8
12 / 12 / 8
Регистрация: 27.12.2012
Сообщений: 448
22.09.2014, 22:57 2
Цитата Сообщение от zewer Посмотреть сообщение
C#
1
2
byte b = 10;
b *= b;//никакого приведения типа не требуеться, компилиться и без него, и результат акой же, как и у (byte) (b*b), т.е. 100
Почему так?
Ибо тип ты обьявил ещё в первой строке и снова его обьявлять не надо.
0
2353 / 1771 / 212
Регистрация: 07.01.2011
Сообщений: 10,342
22.09.2014, 22:59  [ТС] 3
Цитата Сообщение от triadec_96 Посмотреть сообщение
Ибо тип ты обьявил ещё в первой строке и снова его обьявлять не надо.
прокомпильте у себя
C#
1
2
byte b = 10;
b = b*b;
отпишите как компилиться
0
12 / 12 / 8
Регистрация: 27.12.2012
Сообщений: 448
22.09.2014, 23:06 4
Цитата Сообщение от zewer Посмотреть сообщение
b = b*b;
- неправильно
Во мой код:
C#
1
2
3
4
 byte b = 10;
            b *= b;
            Console.WriteLine (b);
            Console.ReadKey();
Вывело 100.
Всё норм. Синтаксис такой. Привыкай.
0
2353 / 1771 / 212
Регистрация: 07.01.2011
Сообщений: 10,342
22.09.2014, 23:08  [ТС] 5

прочитайте еще раз первое сообщение
почему не требуеться явное приведение типов
0
12 / 12 / 8
Регистрация: 27.12.2012
Сообщений: 448
22.09.2014, 23:36 6
Цитата Сообщение от zewer Посмотреть сообщение
почему не требуеться явное приведение типов
Цитата Сообщение от triadec_96 Посмотреть сообщение
Синтаксис такой. Привыкай.
Это как-бы аксиома
0
1146 / 738 / 483
Регистрация: 21.01.2014
Сообщений: 1,903
22.09.2014, 23:48 7
В скомпилированном виде и то и другое будет выглядеть одинаково, так:
C#
1
2
byte b = 10;
b *= b;
Так же посмотрим на пру примеров:
C#
1
2
3
4
5
6
//код в студии:
byte b = 10;
byte c = (byte)(b * b);
//код после компиляции:
byte b = 10;
byte c = b * b;
Как видим, никакого приведения нет.
C#
1
2
3
4
5
6
//код в студии:
int b = 10;
byte c = (byte)(b * b);
//код после компиляции:
int b = 10;
byte c = (byte)(b * b);
Приведение есть. То есть byte = byte * byte, вполне допустимо, но так как во время компиляции (byte * byte) расценивается как int, то приведение необходимо. А в случае byte *= byte, компилятор int'a не усматривает и приведение не нужно.

Не по теме:

P.S. На правильности умозаключение не настаиваю.

1
Заблокирован
23.09.2014, 00:07 8
zewer, компилятор при использовании *= сам проводит преобразование.

C#
1
2
3
4
5
                    Console.WriteLine("0");
                    b *= b;
                    Console.WriteLine("1");
                    b = (byte)(b * b);
                    Console.WriteLine(".");
Если открыть в Ildasm:
Код
 IL_0006:  ldstr      "0"
    IL_000b:  call       void [mscorlib]System.Console::WriteLine(string)
    IL_0010:  nop
    IL_0011:  ldloc.0
    IL_0012:  ldloc.0
    IL_0013:  mul
    IL_0014:  conv.u1
    IL_0015:  stloc.0
    IL_0016:  ldstr      "1"
    IL_001b:  call       void [mscorlib]System.Console::WriteLine(string)
    IL_0020:  nop
    IL_0021:  ldloc.0
    IL_0022:  ldloc.0
    IL_0023:  mul
    IL_0024:  conv.u1
    IL_0025:  stloc.0
    IL_0026:  ldstr      "."
    IL_002b:  call       void [mscorlib]System.Console::WriteLine(string)
1
2353 / 1771 / 212
Регистрация: 07.01.2011
Сообщений: 10,342
23.09.2014, 13:25  [ТС] 9
спасибо
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.09.2014, 13:25
Помогаю со студенческими работами здесь

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

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

Приведение типов в C#
Как считанную из реестра информацию о шрифте присвоить объекту textBox1.Font? Приведение типов...

Приведение типов
Есть две переменные, первая типа Object, вторая неизвестно какого типа. Необходимо привести...


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

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

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