О программном поиске 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 [5898 просмотров]