[Nemerle] Приколы с литералами
От: nikov США http://www.linkedin.com/in/nikov
Дата: 30.01.07 09:36
Оценка:
Есть ли в Nemerle приколы с литералами 2147483648 и 9223372036854775808, как в C#?

30.01.07 18:03: Перенесено модератором из 'Декларативное программирование' — IT
Re: [Nemerle] Приколы с литералами
От: ie Россия http://ziez.blogspot.com/
Дата: 30.01.07 10:22
Оценка:
Здравствуйте, nikov, Вы писали:

N>Есть ли в Nemerle приколы с литералами 2147483648 и 9223372036854775808, как в C#?


А какие с ними в C# приколы?
... << RSDN@Home 1.2.0 alpha rev. 0>>
Превратим окружающую нас среду в воскресенье.
Re[2]: [Nemerle] Приколы с литералами
От: nikov США http://www.linkedin.com/in/nikov
Дата: 30.01.07 11:29
Оценка: :)
Здравствуйте, ie, Вы писали:

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


N>>Есть ли в Nemerle приколы с литералами 2147483648 и 9223372036854775808, как в C#?


ie>А какие с ними в C# приколы?


Как, ты еще не знаешь?

class A {
    const int x = - 2147483648;
    const int y = - (2147483648);
    const int z = - 0x80000000;
}
Re[3]: [Nemerle] Приколы с литералами
От: VladD2 Российская Империя www.nemerle.org
Дата: 30.01.07 14:56
Оценка:
Здравствуйте, nikov, Вы писали:

N>Как, ты еще не знаешь?


N>
N>class A {
N>    const int x = - 2147483648;
N>    const int y = - (2147483648);
N>    const int z = - 0x80000000;
N>}
N>


Я бы не назвал приколом. Это как раз логично. 2147483648 больше чем int.MaxValue и стало быть компилятор расценивает его как long. Далее свертщик констант конвертирует знат и получае отрицательный long. Результат, естественно, не совместим с int.

Тип 0x80000000 uint опять же большеий int.MaxValue и поять же логично, что констант фолдер посылает на фиг такие приколы.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[4]: [Nemerle] Приколы с литералами
От: nikov США http://www.linkedin.com/in/nikov
Дата: 30.01.07 16:12
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Я бы не назвал приколом. Это как раз логично. 2147483648 больше чем int.MaxValue и стало быть компилятор расценивает его как long. Далее свертщик констант конвертирует знат и получае отрицательный long. Результат, естественно, не совместим с int.


Это все понятно. Прикол в первой строке. Знак НЕ является частью литерала. Это отдельная одноместная опрерация.
Тем не менее, если после нее стоит 2147483648 (именно этот токен, а не (2147483648) или 0x80000000 или любое другое константное выражение, дающее 2147483648), она ведет себя особым образом: возвращает не long, а int.
Re[5]: [Nemerle] Приколы с литералами
От: VladD2 Российская Империя www.nemerle.org
Дата: 30.01.07 17:00
Оценка:
Здравствуйте, nikov, Вы писали:

N>Это все понятно. Прикол в первой строке. Знак НЕ является частью литерала. Это отдельная одноместная опрерация.

N>Тем не менее, если после нее стоит 2147483648 (именно этот токен, а не (2147483648) или 0x80000000 или любое другое константное выражение, дающее 2147483648), она ведет себя особым образом: возвращает не long, а int.

Мне кажется ты не прав. Минус сявляется частью литерала. И значение -2147483648 соотвествует int.MinValue.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[6]: [Nemerle] Приколы с литералами
От: VladD2 Российская Империя www.nemerle.org
Дата: 30.01.07 17:02
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Мне кажется ты не прав. Минус сявляется частью литерала. И значение -2147483648 соотвествует int.MinValue.


Иначе как его задать то?
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[6]: [Nemerle] Приколы с литералами
От: nikov США http://www.linkedin.com/in/nikov
Дата: 30.01.07 19:08
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Мне кажется ты не прав.


А что здесь гадать-то?

Смотрим в Ecma-334 или ISO/IEC 23270 определение целочисленного литерала:

9.4.4.2 Integer literals
Integer literals are used to write values of types int, uint, long, and ulong. Integer literals have two
possible forms: decimal and hexadecimal.

integer-literal::
   decimal-integer-literal
   hexadecimal-integer-literal

decimal-integer-literal::
   decimal-digits integer-type-suffix opt

decimal-digits::
   decimal-digit
   decimal-digits decimal-digit

decimal-digit:: one of
   0 1 2 3 4 5 6 7 8 9

integer-type-suffix:: one of
   U u L l UL Ul uL ul LU Lu lU lu


То есть, целочисленный литерал не позволяет записывать отрицательные числа.

А чуть ниже особое правило, применяющееся к литералам 2147483648 и 9223372036854775808:

... the following two rules exist:
• When a decimal-integer-literal with the value 2147483648 (2^31) and no integer-type-suffix appears as
the token immediately following a unary minus operator token (§14.6.2), the result (of both tokens) is a
constant of type int with the value -2147483648 (-2^31). In all other situations, such a decimal-integer literal
is of type uint.
• When a decimal-integer-literal with the value 9223372036854775808 (2^63) and no integer-type-suffix or
the integer-type-suffix L or l appears as the token immediately following a unary minus operator token
(§14.6.2), the result (of both tokens) is a constant of type long with the value -9223372036854775808
(-2^63). In all other situations, such a decimal-integer-literal is of type ulong.

Re[7]: [Nemerle] Приколы с литералами
От: VladD2 Российская Империя www.nemerle.org
Дата: 30.01.07 19:27
Оценка:
Здравствуйте, nikov, Вы писали:

N>А чуть ниже особое правило, применяющееся к литералам 2147483648 и 9223372036854775808:


N>

... the following two rules exist:
N> • When a decimal-integer-literal with the value 2147483648 (2^31) and no integer-type-suffix appears as
N>the token immediately following a unary minus operator token (§14.6.2), the result (of both tokens) is a
N>constant of type int with the value -2147483648 (-2^31). In all other situations, such a decimal-integer literal
N>is of type uint.
N> • When a decimal-integer-literal with the value 9223372036854775808 (2^63) and no integer-type-suffix or
N>the integer-type-suffix L or l appears as the token immediately following a unary minus operator token
N>(§14.6.2), the result (of both tokens) is a constant of type long with the value -9223372036854775808
N>(-2^63). In all other situations, such a decimal-integer-literal is of type ulong.


Ну, вот видишь? Они выполняют спецификацию. Причем точно.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[3]: [Nemerle] Приколы с литералами
От: ie Россия http://ziez.blogspot.com/
Дата: 31.01.07 06:01
Оценка:
Здравствуйте, nikov, Вы писали:

N>Как, ты еще не знаешь?


N>
N>class A {
N>    const int x = - 2147483648;
N>    const int y = - (2147483648);
N>    const int z = - 0x80000000;
N>}
N>


Компилит на ура.
module A
{
  x : int = - 2147483648;
  y : int = - (2147483648);
  z : int = - 0x80000000;
}

Ну а так естественно ругается, только считает 2147483648 не long, а UInt32:
  x : int = 2147483648; // expected int, got System.UInt32 in assigned value: System.UInt32 is not a subtype of System.Int32
... << RSDN@Home 1.2.0 alpha rev. 0>>
Превратим окружающую нас среду в воскресенье.
Re[8]: [Nemerle] Приколы с литералами
От: nikov США http://www.linkedin.com/in/nikov
Дата: 31.01.07 07:50
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Ну, вот видишь? Они выполняют спецификацию. Причем точно.


Так об этом и вопрос был: есть ли в Немерле особое поведение этих двух литералов?
Re[9]: [Nemerle] Приколы с литералами
От: VladD2 Российская Империя www.nemerle.org
Дата: 31.01.07 11:55
Оценка:
Здравствуйте, nikov, Вы писали:

N>Так об этом и вопрос был: есть ли в Немерле особое поведение этих двух литералов?


Мог бы сам попробовать. Вот что получилось у меня:
using System;
using System.Console;
using Nemerle.Utility;

module Program
{
  Main() : void
  {
    def a =   2147483648;
    def b =  -2147483649;
    def x =   2147483647;
    def y =  -2147483648;
    def z = -(2147483648);
    
    def info(x : object) { WriteLine($"'$x' => $(x.GetType())"); }
    info(a);
    info(b);
    info(x);
    info(y);
    info(z);
  }
}

=>
'2147483648'  => System.UInt32
'-2147483649' => System.Int64
'2147483647'  => System.Int32
'-2147483648' => System.Int32
'-2147483648' => System.Int32
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[10]: [Nemerle] Приколы с литералами
От: nikov США http://www.linkedin.com/in/nikov
Дата: 31.01.07 12:08
Оценка:
Здравствуйте, VladD2, Вы писали:

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


N>>Так об этом и вопрос был: есть ли в Немерле особое поведение этих двух литералов?


VD>Мог бы сам попробовать. Вот что получилось у меня:


Я попробовал. Обнаружил, что поведение не такое как в C#. Вот и заитересовался, как же должно быть.
Re[11]: [Nemerle] Приколы с литералами
От: VladD2 Российская Империя www.nemerle.org
Дата: 31.01.07 14:28
Оценка:
Здравствуйте, nikov, Вы писали:

N>Я попробовал. Обнаружил, что поведение не такое как в C#. Вот и заитересовался, как же должно быть.


Поведение разное вроде только в экзотическом случае -(2147483648). По мне так это не важно. Даже лучше.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.