Добро пожаловать! Это — архивная версия форумов на «Хакер.Ru». Она работает в режиме read-only.
 

Странный код C++

Пользователи, просматривающие топик: none

Зашли как: Guest
Все форумы >> [Компилируемые языки] >> Странный код C++
Имя
Сообщение << Старые топики   Новые топики >>
Странный код C++ - 2010-06-07 22:38:42.280000   
ecspertiza

Сообщений: 21
Оценки: 0
Присоединился: 2009-02-09 10:41:43.410000
есть два кода

#include <iostream>
#include <fstream>
#include <limits.h>

int main(int argv, const char** argc) {

std::cout << typeid(ULLONG_MAX).name() << std::endl;
unsigned __int64 max(1024*1024*1024*8);

std::cout << typeid(max).name() << " " << typeid(ULLONG_MAX).name() << " " << max << " " << ULLONG_MAX;

return 0;
}

в этом случае max будет равен 0

#include <iostream>
#include <fstream>
#include <limits.h>

int main(int argv, const char** argc) {

std::cout << typeid(ULLONG_MAX).name() << std::endl;
unsigned __int64 max;

max = 1024;
max *= 1024;
max *= 1024;
max *= 8;

std::cout << typeid(max).name() << " " << typeid(ULLONG_MAX).name() << " " << max << " " << ULLONG_MAX;

return 0;
}

а в этом как положено, почему так? я себе всю голову сломал8|
Post #: 1
RE: Странный код C++ - 2010-06-08 00:07:11.513333   
Denaturat

Сообщений: 1741
Оценки: 453
Присоединился: 2008-10-27 20:50:06.380000
quote:

ORIGINAL: ecspertiza

unsigned __int64 max(1024ULL * 1024 * 1024 * 8);


quote:

ORIGINAL: ecspertiza

а в этом как положено, почему так? я себе всю голову сломал8|


любое значение должно иметь тип, даже временное. временная переменная, хранящая значение 1024 * 1024 * 1024 * 8 по умолчанию у тебя получает тип signed long - отсюда и переполнение. то, что после вычисления значение записывается в unsigned long long, уже не важно - переполнение уже произошло, и данные уже были потеряны
Post #: 2
RE: Странный код C++ - 2010-06-08 17:05:52.786666   
ecspertiza

Сообщений: 21
Оценки: 0
Присоединился: 2009-02-09 10:41:43.410000
Спасибо, теперь понятно :)
Post #: 3
Страниц:  [1]
Все форумы >> [Компилируемые языки] >> Странный код C++







Связаться:
Вопросы по сайту / xakep@glc.ru

Предупреждение: использование полученных знаний в противозаконных целях преследуется по закону.