Балуюсь линуксом всего пару месяцев.
С С++ знаком больше пяти лет, правда весьма поверхностно. Однако для написания курсачей по микроконтроллерам и этого хватало

Недавно решил изучить книжку Стефана Р.Дэвиса: «С++ для чайников» для более близкого знакомства. Книгу выбрал первую попавшуюся, наверняка есть и по-лучше но это сейчас не по теме.
Работая с примерами, столкнулся с некорректным результатом работы простой программы. Побродил в поиске по форуму, но обсуждения конкретно этой проблемы не нашёл.
код проги:
Код:
// BitTest
#include <stdio.h>
#include <iostream.h>
int main(int nArg, char* pszArgs[])
{
//установка вывода в HEX виде
cout.setf(ios::hex, ios::hex);
int nArg1 = 0x1234;
int nArg2 = 0x00ff;
//выполнение логических операций
cout << "Arg1 = 0x" << nArg1 << "\n";
cout << "Arg2 = 0x" << nArg2 << "\n";
cout << "~nArg1 = 0x" << ~nArg1 << "\n";
cout << "~nArg2 = 0x" << ~nArg2 << "\n";
cout << "nArg1 & nArg2 = 0x"
<< (nArg1 & nArg2)
<< "\n";
cout << "nArg1 | nArg2 = 0x"
<< (nArg1 | nArg2)
<< "\n";
cout << "nArg1 ^ nArg2 = 0x"
<< (nArg1 ^ nArg2)
<< "\n";
return 0;
}
Результатом её работы должно быть следующее:
Argl = 0x1234
Arg2 = 0xff
~nArgl = 0xffffedcb
~nArg2 = 0xffffff00
nArgl & nArg2 = 0x34
nArgl | nArg2 = 0x12ff
nArgl ^ nArg2 = 0x12cb
Однако в консоли получаю:
sabivan@sabayonx86 ~/cpp/Bittest $ ./Bittest
Arg1 = 0x2008
Arg2 = 0x1248
~nArg1 = 0x-2009
~nArg2 = 0x-1249
nArg1 $ nArg2 = 0x1216
nArg1 | nArg2 = 0x2040
nArg1 ^ nArg2 = 0x824
Обратите внимание на то что значения Arg1 и Arg2 уже имеют неверное значение еще ДО того как с ними производятся кикае-либо манипуляции (0x2008 и 0x1248 вместо 0x1234 и 0xff соответственно)
Однако под виндами, в Borland C++ 3.1 всё работает как и должно быть.
Пришёл к выводу что некорректно обрабтываются HEX числа, потому что если убрать строку
cout.setf(ios::hex, ios::hex);
а переменным Arg1 и Arg2 присвоить десятичные числа — всё в норме.
Собственно вопрос: почему результат работы с шестнадцатиричными числами отличается от ожидаемого?
P.S. При компиляции получаю ворнинги следующего вида:
Код:
sabivan@sabayonx86 ~/cpp/Bittest $ make
In file included from /usr/lib/gcc/i586-pc-linux-gnu/4.1.1/include/g++-v4/backward/iostream.h:31, from bt.cpp:3:
/usr/lib/gcc/i586-pc-linux-gnu/4.1.1/include/g++-v4/backward/backward_warning.h:32:2: warning: #warning This file includes at least one deprecated or antiquated header. Please consider using one of the 32 headers found in section 17.4.1.2 of the C++ standard. Examples include substituting the <X> header for the <X.h> header for C++ includes, or <iostream> instead of the deprecated header <iostream.h>. To disable this warning use -Wno-deprecated.
bt.cpp:5: warning: unused parameter ‘nArg’
bt.cpp:5: warning: unused parameter ‘pszArgs’
Мне остаётся неясным, ЗАЧЕМ автор использует в функции main аргументы int nArg и char* pszArgs[], ведь если просто написать
int main(void) {
программа всеравно успешно компилируется и работает, однако предупреждение относительно iostream.h остаётся.
bcc.exe на iostream.h не ругается.
P.P.S. Система Sabayon 3.3, ядро 2.6.20. компилировал как через qmake (см. Jasmin Blanchette - C++ GUI Programming with Qt 3), так и напрямую в g++ 4.1, результат один и тот же.