Преобразование чисел в 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'
    }
  }
Re[5]: Преобразование чисел в C#
От: Аноним  
Дата: 11.10.06 13:33
Оценка: -1
писал я как то функцию округления....
так вот она округляла доублы,
как получалось это не правильным сопсобом так:
1)рпеобразовываем в строку
2)режем целое и дробь (строки)
3)формируем строки с ужетом округления:
— целое
— дробь
— перенос.
4)все строки конвертим в доубл и складываем
та вот при сложении трех доублов результат, который также был доубл иногда сбивался например с 3.37 на 3.3699999999999.....
так вот дело оказалось в том, что у не хватает точности доублов (с конца). и правильный выход в этом случае — складывать все в децимал, т.к. у него разрядность больше, а потом, через строку, можно конвертировать в доубл.





данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Преобразование чисел в C#
От: Аноним  
Дата: 10.01.07 08:41
Оценка:
Я хренею, дорогая редакция...

Народ, есть в C# такое понятие, как литералы.
Например, 2 — это литерал. Он имеет тип Int32.

Т.е. если Вы напишете такой код:
long x = 2;
2 приведётся к Int32, а потом — к long.
Правильной будет такая запись:

// 2 уже имеет тип long
long x = 2L; // Оно даже компилируется!!!

Дальше разбирайтесь, направление есть.


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Преобразование чисел в C#
От: Аноним  
Дата: 10.01.07 09:02
Оценка:
Не надо так недооценивать компилятор: в этом случае не будет в коде приведения 2 сначала к инту а потом к лонгу.


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Преобразование чисел в C#
От: Аноним  
Дата: 10.01.07 10:08
Оценка:
Правильно!
Зачем марать руки и форум доказательствами?
Не надо никаких доказательств.
Одна Баба Сказала — лучший аргумент!


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Преобразование чисел в C#
От: Аноним  
Дата: 10.01.07 13:48
Оценка:
И точно, чего это я сразу не заметил что ты доказательств то своих слов не привел. Показывай код на MSIL где мы увидим сначала приведение к инту а потом к лонгу


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Преобразование чисел в C#
От: Аноним  
Дата: 11.01.07 09:35
Оценка:
Итак, код функции:

static void Main(string[] args)
{
long x = 2L;
long y = 2;

Console.WriteLine((x * y).ToString());
}

IL код (режим компиляции — Release):

.method private hidebysig static void Main(string[] args) cil managed
{
.entrypoint
.maxstack 2
.locals init (
[0] int64 num1,
[1] int64 num2,
[2] int64 num3)
L_0000: ldc.i4.2
L_0001: conv.i8
L_0002: stloc.0
L_0003: ldc.i4.2
L_0004: conv.i8
L_0005: stloc.1
L_0006: ldloc.0
L_0007: ldloc.1
L_0008: mul
L_0009: stloc.2
L_000a: ldloca.s num3
L_000c: call instance string int64::ToString()
L_0011: call void [mscorlib]System.Console::WriteLine(string)
L_0016: ret
}

Как видим, конвертация есть даже там, где я считал, её не будет. Так что доверяйте компилятору!


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Преобразование чисел в C#
От: Аноним  
Дата: 12.01.07 13:59
Оценка:
Под рукой студии нету. Попробуй вместо двойки взять скажем 35. Для двойки есть отдельная инструкция ldc.i4.2 похожей интсрукции ldc.i8.2 нету. Для чисел от 0 до 8 специнструкций не наблюдается, так что с 35 ему не удастся так легко отвертеться. В общем компилер наоптимизировал таки.


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Преобразование чисел в C#
От: Аноним  
Дата: 12.01.07 14:22
Оценка:
Хм. Всетаки на интах не интересно проверять, думаю что для 35 и 35L все равно будет один и тот же код: ldc.i4 35 с последующим conv.i8 по одной простой причине, а именно оптимизация, эти две команды элементарно в байтах будут меньше чем ldc.i8 и дело даже не будет тут ни в каких литералах.

Интересные эксперименты:
static void Main(string[] args)
{
    const long x=35;
    const long xl=35L;

    int y=x;
    int yl=xl;
    
    Console.WriteLine((y * yl).ToString());
}


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

В общем нет никакого смысла ЯВНО указывать L после цифири, мозгов компилятору и своих хватает.

Хм. а интересно что он там накомпилирует на int x=100000L и int x=100000 будет хоть что-то отличаться?


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Преобразование чисел в C#
От: Аноним  
Дата: 12.01.07 16:07
Оценка:
Разве что в понедельник теперь.


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Преобразование чисел в C#
От: Аноним  
Дата: 16.01.07 08:49
Оценка:
Попробовал добавлять нули. Мало что изменилось. Всё равно приводит в обоих случаях.
Попробовал с числами, не влезающими в Int32:
.method private hidebysig static void Main(string[] args) cil managed
{
.entrypoint
.maxstack 2
.locals init (
[0] int64 num1,
[1] int64 num2,
[2] int64 num3)
L_0000: ldc.i8 200000000000
L_0009: stloc.0
L_000a: ldc.i8 200000000000
L_0013: stloc.1
L_0014: ldloc.0
L_0015: ldloc.1
L_0016: mul





данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Преобразование чисел в C#
От: Аноним  
Дата: 16.01.07 09:01
Оценка:
Начал доверять компилятору?


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Преобразование чисел в C#
От: Аноним  
Дата: 16.01.07 09:31
Оценка:
ZeeM:
Что то не могу разобраться.

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


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

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

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

Кстати, попробовал откомпилить исходное сообщение. Получилось вот что:
.method private hidebysig static void Main(string[] args) cil managed
{
.entrypoint
.maxstack 2
.locals init (
[0] unsigned int8 num1,
[1] unsigned int8 num2,
[2] string text1)
L_0000: ldc.i4.s 37
L_0002: stloc.0
L_0003: ldc.i4.0
L_0004: stloc.1
L_0005: ldloca.s num1
L_0007: call instance string unsigned int8::ToString()
L_000c: ldloca.s num2
L_000e: call instance string unsigned int8::ToString()
L_0013: call string string::Concat(string, string)
L_0018: stloc.2
L_0019: ldloc.2
L_001a: call void [mscorlib]System.Console::WriteLine(string)
L_001f: ret
}

Видно, что байты хранятся в 4 байтовых ячейках. Но это нормально в 32-х разрядных системах.
-------------------------------------------------
2 ZeeM: 0x25 — это 37 в человеческой системе измерения. Поэтому (может, кто-то уже предлагал) надо делать правильное форматирование (http://msdn2.microsoft.com/en-us/library/dwhawy9k.aspx):
byte a = 0x25;
byte b = 0x00;

string temp = a.ToString("x") + b.ToString("x");
БУДЕТ КАК РАЗ ТО, ЧТО НУЖНО!
-------------------------------------------------
2 RuneLord:
С какой стати я должен ему доверять?
Microsoft редко делает что-то хорошее.
Как Ты делал человеческое форматирование кода в своём сообщении (цвета там, отступы)?


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Преобразование чисел в C#
От: Аноним  
Дата: 17.01.07 07:36
Оценка:
Ну скажем так, он все равно оптимизирует лучше чем я и качественнее и главное быстрее

Если постишь через gotdotnet, там есть четыре кнопки на тулбаре которые вставляют из клипборда C#, VB, SQL, XML


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.