Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
| | | | | |
Наверное, лучше в sysadmin перенести. 05.10.05 12:43 Число просмотров: 1682
Автор: Den <Денис Т.> Статус: The Elderman
|
|
<site updates>
|
Баг в командном процессоре cmd.exe 04.10.05 20:19
Publisher: Den <Денис Т.> Статус: The Elderman
|
Обработка чисел с лидирующими нулями в командном процессоре cmd.exe Den http://www.bugtraq.ru/cgi-bin/iforum.mcgi?type=si&u=5269
Случайно обнаружился интересный глюк в cmd.exe на MS Windows 2000 Server, проявляющийся при попытке произвести арифметическую операцию с двузначными и более числами, предваренными лидирующими нолями, с последующим присвоением переменной окружения.
Попробуйте:
set /a test=0054-1
set /a test=0111
set /a test=4*0110
С подобным глюком можно легко столкнуться при конвертировании каких-либо данных в числовой формат с помещением результата в переменную окружения для последующей обработки в скрипте.
Причина - правила интерпретации числовых констант, которые могут быть либо десятичными (17), либо шестнадцатиричными (0x11), либо восьмиричными (021).
WORKAROUND:
Глюка можно обойти, если использовать следующее выражение для отбрасывания лидирующих нолей:
for /F "tokens=* delims=0" %i in ("0110") do set /a test=4*%i
Полный текст
|
|
И не только в win2000, также "прекрасно" работает и в ХР :-) 12.10.05 14:09
Автор: Nemetc Статус: Незарегистрированный пользователь
|
|
|
Стандартные C-шные числовые литералы 05.10.05 11:51
Автор: amirul <Serge> Статус: The Elderman
|
#include "stdio.h"
void
main() {
printf("%d\t%d\t%d\n", 10, 0x10, 010);
}
---
Так как cmd.exe скорее всего написан на C, и числа соответственно читаются чем нибудь вроде scanf-а (или atoi если число в текстовом предварительно считано в память), то и их интерпретация сишная
|
| |
Спасибо. Уже понял где собака M$ порылась. 05.10.05 12:57
Автор: Den <Денис Т.> Статус: The Elderman
|
Если бы M$ об этом в виндовом хелпе упомянули или прочел бы я set /? внимательнее, то не попался бы на эту удочку.
|
|
грохаю? 04.10.05 22:42
Автор: dl <Dmitry Leonov>
|
Это скорее стоит оформить как текст в faq, для новостной ленты не очень подходит.
|
| |
Зачем грохать? ИМХО, лучше тогда уж переместить, например, в sysadmin или operating systems. 04.10.05 22:47
Автор: fly4life <Александр Кузнецов> Статус: Elderman Отредактировано 04.10.05 22:53 Количество правок: 2
|
> Это скорее стоит оформить как текст в faq, для новостной > ленты не очень подходит.
Ну, и в ФАК тоже конечно можно, с поправкой, сделанной ds
Правда, не знаю насколько сей вопрос - 'frequently' ;)
|
| | |
я не про форум, я про ленту, куда это ушло 04.10.05 22:53
Автор: dl <Dmitry Leonov>
|
А frequently или не очень - это дело субъективное, главное, что может пригодиться другим, на это напоровшимся.
|
| | | |
А про ленту ты ещё и спрашиваешь?! ;) 04.10.05 22:55
Автор: fly4life <Александр Кузнецов> Статус: Elderman
|
|
| | | | |
я человек щепетильный :) перенес в FAQ 04.10.05 23:09
Автор: dl <Dmitry Leonov> Отредактировано 04.10.05 23:14 Количество правок: 1
|
|
| | | | | |
Наверное, лучше в sysadmin перенести. 05.10.05 12:43
Автор: Den <Денис Т.> Статус: The Elderman
|
|
|
Это не баг, не глюк, а фича: 04.10.05 22:38
Автор: ds Статус: Незарегистрированный пользователь
|
> Баг в командном процессоре cmd.exe > > > > Случайно обнаружился интересный глюк в cmd.exe на MS > Windows 2000 Server, проявляющийся при попытке произвести > арифметическую операцию с двузначными и более числами, > предваренными лидирующими нолями, с последующим присвоением > переменной окружения.
Это не баг, не глюк, а фича:
С:\>set /a test=008
Invalid number. Numeric constants are either decimal (17),
hexadecimal (0x11), or octal (021).
---
|
| |
Нифига себе фича!... :)) Ты когда последний раз пользовался восьмеричным исчислением? 05.10.05 12:40
Автор: Den <Денис Т.> Статус: The Elderman Отредактировано 05.10.05 12:58 Количество правок: 1
|
Попался на это при конвертировании даты.
|
| | |
Частенько пользуюсь. chmod 644 например 06.10.05 13:19
Автор: :-) <:-)> Статус: Elderman
|
|
| | |
В 88-м году! На Электронике-60 Бэйсик запускал по 8-ричному адресу. 06.10.05 04:07
Автор: Zef <Alloo Zef> Статус: Elderman
|
|
| | | |
Ух ты! Это ж вот, недавно было! ;) 06.10.05 12:13
Автор: Den <Денис Т.> Статус: The Elderman
|
|
|
Warkaround в догонку. 04.10.05 21:20
Автор: Den <Денис Т.> Статус: The Elderman
|
> WORKAROUND:
> Глюка можно обойти, если использовать следующее выражение > для отбрасывания лидирующих нолей:
> for /F "tokens=* delims=0" %i in ("0110") do call set /a > test=4*%i
В команде for ... do ... не обязательно ставить call, так тоже работает.
for /F "tokens=* delims=0" %i in ("0110") do set /a test=4*%i
|
|
|