Форум программистов, компьютерный форум CyberForum.ru

Как работает функция "test" в приведенном коде - C++

Восстановить пароль Регистрация
 
 
Zla9_Kolu4ka
2 / 2 / 0
Регистрация: 28.08.2013
Сообщений: 398
14.01.2014, 16:14     Как работает функция "test" в приведенном коде #1
Объясните как работает функция test

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include <conio.h>
#include <iostream.h>
#include <limits.h>
 
int     test(long int a)
     {return ((a>>15)+1)&~1;}
 
int     primC(int a, const int b, const int c, const int d)
{ double z = (2.0*a+1.0*b*c)/(d-a);  //!!!!!!!!!! ВНИМАНИЕ !!!!!!!!!!!!!!!!!
  if (z > SHRT_MIN && z < SHRT_MAX) return z;
   else
    { cout << "\n!!!!!!!!!!! Limits of int value !!!!!!!!!!!\n  x = "
           << z << endl;
      return SHRT_MIN; //-32768
     }
 }
 
int X,a;
 
void main(void)
{   char ch;
    const b=-333;
    const c= 1000;
    const d=-10;
    long int a1;
    do {X = 0;
        cout << "\n    x=(2*a+b*c)/(d-a);  int x,a,b=-333,c=1000,d=-10;" << endl;
        do{ cout<<"\n    Enter a [-32768..32767], a!= " << d << " ====> ";
            cin>> a1;
           }while (test(a1) || d - a1 == 0 || test (d-a1));
        a = a1;
        X = primC(a, b, c, d);
        if (X!=SHRT_MIN)
         { cout << " Result (C++) x = " << X << endl;
          }
        cout << "\n\nExit? - (y/n)\n";
        ch = getch();
       } while (!(ch=='y' || ch =='Y'));
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4928 / 2671 / 243
Регистрация: 29.11.2010
Сообщений: 7,429
15.01.2014, 02:08     Как работает функция "test" в приведенном коде #21
Цитата Сообщение от Zla9_Kolu4ka Посмотреть сообщение
Этот код под 16 бит, а не 32
По стандарту, ничто не гарантирует, что int или short int и т.д. (не считая char и unsigned char) занимает какое-то определенное кол-во памяти.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ValeryS
Модератор
6378 / 4844 / 442
Регистрация: 14.02.2011
Сообщений: 16,066
15.01.2014, 02:31     Как работает функция "test" в приведенном коде #22
Цитата Сообщение от Zla9_Kolu4ka Посмотреть сообщение
Этот код под 16 бит, а не 32
а где это было указано?
теперь смотрим
максимальное положительное число для 2 байт
32767 0х7FFF
>>15=0
(0+1)&0xFFFE=0
минимальное отрицательное
-32768 0x8000
>>15=0xFFFF
0xFFFF+1=0 &0xFFFE=0
в результате функция всегда возвращает 0

единственно что я могу предположить что функция возвращает не 0 если число отрицательное
но тогда в прототипе должно быть
C++
1
int     test(unsigned long int a)
тогда
0x8000
>>15=0x0001
0x0001+1=2 &0xFFFE=2
Zla9_Kolu4ka
2 / 2 / 0
Регистрация: 28.08.2013
Сообщений: 398
15.01.2014, 02:41  [ТС]     Как работает функция "test" в приведенном коде #23
а где это было указано?
Тут по коду понятно
C++
1
2
int     primC(int a, const int b, const int c, const int d)
      return SHRT_MIN; //-32768
int 16-ти битное
ValeryS
15.01.2014, 02:44
  #24

Не по теме:

Цитата Сообщение от Zla9_Kolu4ka Посмотреть сообщение
Тут по коду понятно
да по этому коду, много что понятно

Zla9_Kolu4ka
2 / 2 / 0
Регистрация: 28.08.2013
Сообщений: 398
15.01.2014, 19:30  [ТС]     Как работает функция "test" в приведенном коде #25
минимальное отрицательное
-32768 0x8000
>>15=0xFFFF
Не пойму, почему тут 0xFFFF, а не 0x0001
ValeryS
Модератор
6378 / 4844 / 442
Регистрация: 14.02.2011
Сообщений: 16,066
15.01.2014, 19:54     Как работает функция "test" в приведенном коде #26
Цитата Сообщение от Zla9_Kolu4ka Посмотреть сообщение
Не пойму, почему тут 0xFFFF, а не 0x0001
потому что сдвиг вправо отличается для знаковых и беззнаковых типов
при сдвиге беззнаковых в левый разряд записывается 0
а при сдвиге знаковых в левый разряд записывается копия знакового бита(левого разряда)
так при сдвиге безнаковых
0x8000(1000 0000 0000 0000)>>1=0x4000(0100 0000 0000 0000)
а так при сдвиге знаковых
0x8000(1000 0000 0000 0000)>>1=0xC000(1100 0000 0000 0000)
чтобы было понятней
-32768(0x8000)/2=-16384(0xC000)
32768(0x8000)/2=16384(0x4000)
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
15.01.2014, 19:58     Как работает функция "test" в приведенном коде #27
Цитата Сообщение от MrGluck Посмотреть сообщение
Элементарно:
здесь её нет
читай:
Цитата Сообщение от Zla9_Kolu4ka Посмотреть сообщение
int * * test(long int a)
* * *{return ((a>>15)+1)&~1;}
.
Цитата Сообщение от Zla9_Kolu4ka Посмотреть сообщение
Объясните как работает функция test
А прочитать ни как? Всего то сдвиг параметра на 15 бит, потом арифметическое сложение результата с единицей, к сумме побитно применяется И c числом, все биты которого противоположны битам единицы в разрядности long int.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.01.2014, 21:42     Как работает функция "test" в приведенном коде
Еще ссылки по теме:

C++ Структура "Штраф". Функция поиска криво работает
Патерн "прототип" не работает, выдаёт ошибку "недопустимый вызов нестатической ф-ции", где я в коде ошибка? C++
Не работает функция itoa(): "was not declared in this scope" C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4928 / 2671 / 243
Регистрация: 29.11.2010
Сообщений: 7,429
15.01.2014, 21:42     Как работает функция "test" в приведенном коде #28
Цитата Сообщение от taras atavin Посмотреть сообщение
читай:
читай
Цитата Сообщение от MrGluck Посмотреть сообщение
wolf1396, ТС изначально скинула файл на форум, где функция test называлась по другому. Когда я сделал замечание - она исправила код (можно в течении 5 минут после публикации) и зачем то (!!!) еще и написала мне что мол я просто так придираюсь. А я, как писал уже выше, даже через поиск Ctrl + F проверил наличие сией функции.
Цитата Сообщение от Zla9_Kolu4ka Посмотреть сообщение
просто я когда написала код, смотрю, имя функции не test, а temp и подправила и даже не предала этому значения вообще, потому что temp функция была где то секунд 30
Yandex
Объявления
15.01.2014, 21:42     Как работает функция "test" в приведенном коде
Ответ Создать тему
Опции темы

Текущее время: 14:44. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru