Здравствуйте, ie, Вы писали:
ie>Здравствуйте, nikov, Вы писали:
N>>Есть ли в Nemerle приколы с литералами 2147483648 и 9223372036854775808, как в C#?
ie>А какие с ними в C# приколы?
Как, ты еще не знаешь?
class A {
const int x = - 2147483648;
const int y = - (2147483648);
const int z = - 0x80000000;
}
Здравствуйте, 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>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
VD>Я бы не назвал приколом. Это как раз логично. 2147483648 больше чем int.MaxValue и стало быть компилятор расценивает его как long. Далее свертщик констант конвертирует знат и получае отрицательный long. Результат, естественно, не совместим с int.
Это все понятно. Прикол в первой строке. Знак НЕ является частью литерала. Это отдельная одноместная опрерация.
Тем не менее, если после нее стоит 2147483648 (именно этот токен, а не (2147483648) или 0x80000000 или любое другое константное выражение, дающее 2147483648), она ведет себя особым образом: возвращает не long, а int.
Здравствуйте, nikov, Вы писали:
N>Это все понятно. Прикол в первой строке. Знак НЕ является частью литерала. Это отдельная одноместная опрерация. N>Тем не менее, если после нее стоит 2147483648 (именно этот токен, а не (2147483648) или 0x80000000 или любое другое константное выражение, дающее 2147483648), она ведет себя особым образом: возвращает не long, а int.
Мне кажется ты не прав. Минус сявляется частью литерала. И значение -2147483648 соотвествует int.MinValue.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, 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.
Здравствуйте, 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>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, nikov, Вы писали:
N>>Так об этом и вопрос был: есть ли в Немерле особое поведение этих двух литералов?
VD>Мог бы сам попробовать. Вот что получилось у меня:
Я попробовал. Обнаружил, что поведение не такое как в C#. Вот и заитересовался, как же должно быть.