БлогNot. О программном поиске INT_MAX и дополнительном коде числа...

О программном поиске INT_MAX и дополнительном коде числа...

Пара полезных функций от сегодня, чтоб не стирать:

  • int get_max_int () находит значение INT_MAX (максимально возможное int со знаком), основываясь на взятом из кода sizeof(int);
  • int convert(int a) преобразует значение a в дополнительный код. На самом деле, современные IBM-совместимые компьютеры уже хранят отрицательные числа в дополнительном коде, поэтому теоретически правильный перевод в окне консоли даст прямое представление :) Можно, наверное, поизвращаться как в третьей функции, выполняя нужные преобразования над символьной строкой;
  • char * print_b (int a) - напечатать в новую строку int a (со знаком) как цепочку бит, потом цепочку можно просто вывести на печать по шаблону %s.

Тестовая программа должна одинаково сработать как в консоли нового Visual Studio, так и, допустим, в старом консольном Borland C++ 3.1 или в консольном проекте C++ Builder. Полный код примера:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <math.h>

int get_max_int () { 
 //получить максимальное int со знаком в зависимости от sizeof(int)
 int a=0;
 int size=sizeof(a)*8;
 int max=0;
 for (int i=0; i<size-1; ++i) max|=(1<<i);
 return max;
}

int convert(int a) { 
 //преобразовать a в дополнительный код
 unsigned int half=(unsigned int)get_max_int()+1u;
 if (a < 0) a = ( ~-a|half ) + 1;
 return a;
}

char * print_b (int a) { 
 //напечатать в новую строку int a (со знаком) как цепочку бит
 int size=sizeof(a)*8;
 char *buf = new char [size+1];
 for(int i=size-1; i>=0; --i) buf[size-1-i] = a & (1<<i)?'1':'0';
 buf[size]='\0';
 return buf;
}

void main() {
 int a = 127;
 int b = convert(a);
 printf ("\nmax_int = %d",get_max_int());
 printf ("\na=%d (%s), b=%d (%s)",a,print_b(a),b,print_b(b));   
 getchar(); 
}

13.10.2015, 17:54 [5781 просмотр]


теги: c++ программирование числа

К этой статье пока нет комментариев, Ваш будет первым