Перевод в двоичную систему с указателями С++
Выполнить ввод с клавиатуры двух чисел типа 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 шт):
Компилируем ваш код добавив опции варнингов, например для 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 библиотек в которых не можете разобраться)!
Разобрался, мб кому-нибудь поможет:)
#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;
}