| 
 
 
 
 Легенда:
  новое сообщение 
  закрытая нитка 
  новое сообщение 
  в закрытой нитке 
  старое сообщение   | 
Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
Новичкам также крайне полезно ознакомиться с данным документом.
|  |  |  |  |  | я человек щепетильный :) перенес в FAQ  04.10.05 23:09  Число просмотров: 1811 Автор: dl <Dmitry Leonov>
 Отредактировано 04.10.05 23:14  Количество правок: 1
 |  
|  |  | <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
 |  
 
 
 |  |