Преобразование чисел в C#
От: ZeeM  
Дата: 10.10.06 16:29
Оценка:
Что то не могу разобраться.

есть два числа
byte a = 0x25;
byte b = 0x00;


мне необходимо преобразовать это в строку "250"

варианты типа:

string temp = a.ToString() + b.ToString(); не катят, т.к. получаются что байты сначала преобразуются в int. Как сделать это корректно?
Преобразование чисел в C#
От: Аноним  
Дата: 10.10.06 16:48
Оценка: +1
string temp = Convert.ToString(a,16) + Convert.ToString(b,16);


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Re: Преобразование чисел в C#
От: Alexey Ivanov Россия  
Дата: 11.10.06 08:17
Оценка:
Здравствуйте, Scif, Вы писали:

string temp = Convert.ToString(a,16) + Convert.ToString(b,16);


Это тож вызывает внутри себя преобразование к Int32.

Скорее всего не получится напрямую получить строку
Re: Преобразование чисел в C#
От: Аноним  
Дата: 11.10.06 08:29
Оценка:
Это с чего это Вы взяли?
....
А это
byte a = 0x25;
не вызывает?



данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Re: Преобразование чисел в C#
От: Аноним  
Дата: 11.10.06 08:47
Оценка:
a.ToString("x") + b.ToString("x");


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Re[2]: Преобразование чисел в C#
От: Alexey Ivanov Россия  
Дата: 11.10.06 08:54
Оценка:
Здравствуйте, Scif, Вы писали:

S>Это с чего это Вы взяли?

S>....

Есть такая штука как Рефлектор, вот с помощью него и посмотрел

Convert.ToString(byte) вызывает byte.ToString(), а он вызывает Number.FormatInt32(int, ...)

S>А это

S>byte a = 0x25;
S>не вызывает?

Это конечно не совсем корректное присваивание, но компилятор вполне себе справляется
Re[2]: Преобразование чисел в C#
От: Аноним  
Дата: 11.10.06 09:01
Оценка:
ну в таком случае и это тоже также
аботает
a.ToString("x") + b.ToString("x");
так что вопрос есть ли впринципе метод перевода байта в текс не использующий приведения в инт?


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Re[2]: Преобразование чисел в C#
От: Аноним  
Дата: 11.10.06 09:08
Оценка:
a.ToString("x") + b.ToString("x");
Это как раз дает правильный результат, модификатор "x" значит привести в шестнадцатеричный вид и 0x25 будет как "25", а 0x00 как "0". Вы сначала попробуйте, а потом говорите, если в своих знаниях не уверены.


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Re[2]: Преобразование чисел в C#
От: Аноним  
Дата: 11.10.06 09:18
Оценка:
Уважаемый, Вы слегка не правильно меня поняли,
я не говорю что работает не правильно.
НО, как уже заметил Alexey Ivanov,
и мой и Ваш вариант в конце концов обращаються к методу Number.FormatInt32(int, ...), передача параметров которому ведет к неявному преобразованию byte в int
и рефлектор это хорошо показывает.



данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Re: Преобразование чисел в C#
От: Pavel M. Россия  
Дата: 11.10.06 09:45
Оценка:
Здравствуйте, ZeeM, Вы писали:

ZM>Что то не могу разобраться.


ZM>есть два числа

ZM>byte a = 0x25;
ZM>byte b = 0x00;


ZM>мне необходимо преобразовать это в строку "250"


ZM>варианты типа:


ZM>string temp = a.ToString() + b.ToString(); не катят, т.к. получаются что байты сначала преобразуются в int. Как сделать это корректно?


А , почему нельзя в int? Память экономим?
--------------------------
less think — do more
Преобразование чисел в C#
От: Аноним  
Дата: 11.10.06 09:58
Оценка:
Если родной byte.ToString() не подходит, самое время переходить на asm или стандартный С/С++.
-----
Нулевое оформления постов благодаря Opere.


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Преобразование чисел в C#
От: Аноним  
Дата: 11.10.06 10:08
Оценка:
To Scif Прошу прощения


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Re[3]: Преобразование чисел в C#
От: Red Bird Россия  
Дата: 11.10.06 11:13
Оценка:
Здравствуйте, Scif, Вы писали:

S>и мой и Ваш вариант в конце концов обращаються к методу Number.FormatInt32(int, ...), передача параметров которому ведет к неявному преобразованию byte в int


Это преобразование (byte в int32) будет выполняться всегда ибо так работает .Net.
Так как только для Int32 определены арифметические операции.

Как это не поакжется странным, но в:
byte a = 1;
byte b = 10;
a = b*2;

Оператор a = b*2; будет вызывать преобразование к Int32.
Re: Преобразование чисел в C#
От: Lloyd Россия  
Дата: 11.10.06 11:53
Оценка:
Здравствуйте, ZeeM, Вы писали:

ZM>string temp = a.ToString() + b.ToString(); не катят, т.к. получаются что байты сначала преобразуются в int. Как сделать это корректно?


Почему вы считаете такое поведение некорректным?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[4]: Преобразование чисел в C#
От: Pavel M. Россия  
Дата: 11.10.06 12:02
Оценка:
Здравствуйте, Red Bird, Вы писали:

RB>Здравствуйте, Scif, Вы писали:


S>>и мой и Ваш вариант в конце концов обращаються к методу Number.FormatInt32(int, ...), передача параметров которому ведет к неявному преобразованию byte в int


RB>Это преобразование (byte в int32) будет выполняться всегда ибо так работает .Net.

RB>Так как только для Int32 определены арифметические операции.

RB>Как это не поакжется странным, но в:

RB>
RB>byte a = 1;
RB>byte b = 10;
RB>a = b*2;
RB>

RB>Оператор a = b*2; будет вызывать преобразование к Int32.


Это не кажется странным вовсе, потому что это делается для того, чтобы избежать потери данных при переполнении числа, ведь произведение может завалиться за диапазон байта.
--------------------------
less think — do more
Re[5]: Преобразование чисел в C#
От: Lloyd Россия  
Дата: 11.10.06 12:09
Оценка:
Здравствуйте, Pavel M., Вы писали:

PM>Это не кажется странным вовсе, потому что это делается для того, чтобы избежать потери данных при переполнении числа, ведь произведение может завалиться за диапазон байта.


По твоей логике при умножении int-ов должно проводиться приведение к long-ам.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[4]: Преобразование чисел в C#
От: Аноним  
Дата: 11.10.06 12:11
Оценка:
Ваши бы слова,....
а почему тогда double+double=double, а не decimal?



данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Re[5]: Преобразование чисел в C#
От: Pavel M. Россия  
Дата: 11.10.06 12:55
Оценка:
Здравствуйте, Scif, Вы писали:

S>Ваши бы слова,....

S>а почему тогда double+double=double, а не decimal?


S>
данное сообщение получено с www.gotdotnet.ru

S>ссылка на оригинальное сообщение


decimal никаким боком не относится к double, в МСДН он даже отдельно стоит


Structs fall into these categories:

Numeric types

Integral types

Floating-point types

decimal

bool

User defined structs.

--------------------------
less think — do more
Re[6]: Преобразование чисел в C#
От: Pavel M. Россия  
Дата: 11.10.06 12:58
Оценка:
Здравствуйте, Lloyd, Вы писали:

L>Здравствуйте, Pavel M., Вы писали:


PM>>Это не кажется странным вовсе, потому что это делается для того, чтобы избежать потери данных при переполнении числа, ведь произведение может завалиться за диапазон байта.


L>По твоей логике при умножении int-ов должно проводиться приведение к long-ам.




ну, должен же предел быть
--------------------------
less think — do more
Re[5]: Преобразование чисел в C#
От: desco США http://v2matveev.blogspot.com
Дата: 11.10.06 13:21
Оценка:
Здравствуйте, Pavel M., Вы писали:

если переполнение произойдет в checked контексте — OverflowException, если в unchecked — старшие биты, не помещающиеся в диапазон, отбрасываются.

а вообще существует ряд predefined операторов умножения для целых чисел


int operator *(int x, int y);
uint operator *(uint x, uint y);
long operator *(long x, long y);
ulong operator *(ulong x, ulong y);


при выполнении умножения выполняется поиск первого оператора из списка для которого существует неявное преобразование между фактическими и формальными типами операндов.

  class Program
  {
    public static void Print<T>(T arg)
    {
      Console.WriteLine(typeof(T).FullName);
    }
    
    public static void Main()
    {
      byte a = 20;
      short b = 30;
      double c = 40;
      Print(a * b); // System.Int32
      Print(a * c); // System.Double

      long d = 50;
      Print(c * d); // System.Double
      int f = 50;      
      Print(f * d); // System.Int64
      ulong e = 60;      
      //Print(d + e); // Operator '+' cannot be applied to operands of type 'long' and 'ulong'
    }
  }
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.