'0' и 48 это на самом деле одно и тоже : 48. код обоих частей будет одинаковый и примерно такой: Code (Text): mov al, 49 sub al, 48
Code (Text): int main( ) { char a = '1'; a -= '0'; return 0; } транслируется в: жирным я выделил то, что тебя интересует. PUSH EBP / MOV EBP,ESP - создание фрейма стека (или кадра стека, как больше нравится) PUSH ECX - резервирование места под переменную По адресу SS:[EBP-4] хранится моя переменная a. MOV BYTE PTR SS:[EBP-4],31 присваивает ей значение 31h (49) MOV AL,BYTE PTR SS:[EBP-4] копирует временно переменную в регистр SUB AL,30 - вычитает из регистра 30h (48) MOV BYTE PTR SS:[EBP-4],AL записывает регистр обратно в переменную XOR EAX,EAX / MOV ESP, EBP / POP EBP / RETN return 0 с освобождением кадра стека Теперь ясно? '0' и 48 на самом деле различаются только компилятором, а в бинарном файле разницы не будет _НИКАКОЙ_.
Great Вообще-то "push ecx" - это не сохранение ecx, а резервирование места под локальную переменную [ebp-4].
Дык это потому что компилятор не тупой Он просто сразу начальную константу поменял и всё. Вы же не ожидаете что при коде Code (Text): char c='1'-'0'; будет сгенерировано вычитание...
cppasm Как показал Great в #8 компилятор может быть еще тупее ) А в Оле нужно искать не "sub al,48", а по крайней мере "sub R8,30" т.к. и регистр м.б. другим и числа Оля показывает в 16-ричном виде
leo Я уверен, что VC++ в режиме оптимизации такого кода сгенерировать не мог. Он вообще бы выбросил манипуляции с переменной а , сгенерировав: Code (Text): xor eax, eax ret