Перевод в двоичную систему с указателями С++

Выполнить ввод с клавиатуры двух чисел типа short. Выделить байты этих чисел (с использованием указателя) и получить число типа int (с использова-нием побитовых операций), старшие два байта которого составлены из млад-ших байтов введенных чисел, а младшие два байта – из старших байтов введен-ных чисел. Полученное число разместить в динамической памяти и вывести на экран его двоичное представление. Если N-й бит полученного числа равен 1, вычислить сумму байтов нового числа, иначе – их произведение и вывести ре-зультат на экран.

мой код:

 #include <stdio.h>
#include <stdlib.h>
#include <windows.h>

int main() {
system("chcp 1251");
unsigned short Num1,Num2;
printf("Vvedi Num1\n");
scanf("%hx",&Num1);
printf("\nNum1=%06x\n",Num1);
printf("Vvedi Num2\n");
scanf("%hx",&Num2);
printf("\nNum2=%06x\n",Num2);


unsigned char *point1, *point2, *point3, *point4;
point1 = (unsigned char*)&Num1;
printf("\nMladshyi byte Num1: %#04x",*point1);
point2 = (unsigned char*)&Num1+1;
printf("\nStarshyi byte Num1: %#04x",*point2);
point3 = (unsigned char*)&Num2;
printf("\nMladshyi byte Num2: %#04x",*point3);
point4 = (unsigned char*)&Num2+1;
printf("\nStarshyi byte Num2: %#04x\n",*point4);


unsigned int *Number = new unsigned int(0);
*Number=*Number+*point1;
*Number=*Number<<8;
*Number=*Number+*point3;
*Number=*Number<<8;
*Number=*Number+*point2;
*Number=*Number<<8;
*Number=*Number+*point4;
printf("\nNumber=%#010x\n",*Number);


unsigned int *Ostatok, i;
while (*Number>0)
    {
        Ostatok[i]=*Number%2;
        *Number=*Number/2;
        i++;
    }
        int n=i;
        for (i = n-1; i>=0; i--)
    {
        printf("%i",Ostatok[i]);
    }

system("pause");
return 0;
}

На данном этапе консоль вылетает.В отладчике ошибка Access violation at 0x004013c0: write of address 0x01499264


Ответы (2 шт):

Автор решения: Andrej Levkovitch

Компилируем ваш код добавив опции варнингов, например для gcc:

g++ a.cpp -Wall

И сразу же получаем предупреждение:

a.cpp: In function ‘int main()’:
a.cpp:35:14: warning: ‘Ostatok’ may be used uninitialized in this function [-Wma
ybe-uninitialized]
     Ostatok[i] = *Number % 2;

PS включайте как можно больше предупреждений - и фиксите их все (кроме варнинков из third-party библиотек в которых не можете разобраться)!

→ Ссылка
Автор решения: Ilya

Разобрался, мб кому-нибудь поможет:)

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>

int main() {
system("chcp 1251");
unsigned short Num1,Num2;
printf("Vvedi Num1\n");
scanf("%hx",&Num1);
printf("\nNum1=%06x\n",Num1);
printf("Vvedi Num2\n");
scanf("%hx",&Num2);
printf("\nNum2=%06x\n",Num2);


unsigned char *point1, *point2, *point3, *point4;
point1 = (unsigned char*)&Num1;
printf("\nMladshyi byte Num1: %#04x",*point1);
point2 = (unsigned char*)&Num1+1;
printf("\nStarshyi byte Num1: %#04x",*point2);
point3 = (unsigned char*)&Num2;
printf("\nMladshyi byte Num2: %#04x",*point3);
point4 = (unsigned char*)&Num2+1;
printf("\nStarshyi byte Num2: %#04x\n",*point4);


unsigned int *Number = new unsigned int(0);
*Number=*Number+*point1;
*Number=*Number<<8;
*Number=*Number+*point3;
*Number=*Number<<8;
*Number=*Number+*point2;
*Number=*Number<<8;
*Number=*Number+*point4;
printf("\nNumber=%#010x\n",*Number);


int  i=0;
unsigned int *Ostatok=new unsigned int(1);
while (*Number>0)
    {
        Ostatok[i]=*Number%2;
        *Number=*Number/2;
        i++;
    }
        printf("Dvoicnoe Number:");
        int n=i;
        for (n; n>=0; n--)
    {
        printf("%i",Ostatok[n]);
    }
printf("\nVvedite nomer bita:");
int Bit;
scanf("%i", &Bit);

if ((Bit >= 0) && (Bit <= i)) {

            int Summa = 0;
            int Proizved = 1;
            for (i; i>=0; i--){

                if ((i==Bit)&&(Ostatok[i] == 1)) {
                    Summa = *point1 + *point2 + *point3 + *point4;
                    printf("\nSumma bytov= %#X\n", Summa);



                }

                if ((i==Bit)&&(Ostatok[i] == 0)) {
                    Proizved = *point1 * *point2 * *point3 * *point4;
                    printf("\nProizvedenie bytov= %#X\n", Proizved);
                 }
             }
        }
system("pause");
return 0;
}
→ Ссылка