Crulas Ответов: 4

Нужна помощь в понимании шестнадцатеричных входных данных


Учитывая этот код
#include <stdio.h>
 
int main(void)
{
  int a[3] = {0x80000000 , 0x80000000 , 0x80000000};
  int i , j , k;
  for ( i = 0 ; i < 10 ; ++i )
  { 
int tmp;
scanf("%d",&tmp);
for(j=0 ; j<3;++j)
{ 
if(tmp>a[j])
{ int k;
for(k=2;k>j;--k)
{ 
a[k]=a[k-1];
}
a[j] = tmp;
break;
}
}
  }
  printf("%d %d %d\n",a[0] , a[1] , a[2]);
  return 0;
}


Что я уже пробовал:

Это выведет 3 самых больших числа в массиве, которые пользователь ввел.
У меня есть приблизительное представление о том, как работает массив, но чего я не понимаю, так это этой строки.

int a[3] = {0x80000000 , 0x80000000 , 0x80000000};


как работает инициализация a[3] до 0x8000000?

4 Ответов

Рейтинг:
28

OriginalGriff

int a[3] = {0x80000000 , 0x80000000 , 0x80000000};

Он создает массив из трех элементов, каждый из которых содержит одно и то же значение: 0x80000000
Поскольку целочисленное значение равно 32 битам, наименьшее шестнадцатеричное значение, которое оно может содержать, равно 0x00000000, а самое большое - 0xFFFFFFFF-но есть одна морщинка.
целые числа являются знаковыми значениями: они не работают от 0 до 4 294 967 295 (строгая интерпретация 0x0 до 0xFFFFFFFF), вместо этого они хранят положительные и отрицательные значения, давая диапазон от -2 147 483 648 до 2 147 483 647.
И они делают это, говоря: "любое число с наиболее значимым набором битов отрицательно, в противном случае оно положительно"
Наиболее значимым битом является бит номер 31, наименее значимым-бит номер 0.
А если вы установите бит номер 31 и сбросите все остальные, то получите:
10000000000000000000000000000000 in binary
80000000 in hexadecimal
Это отрицательное число, и на самом деле это минимальное значение, которое вы можете поместить в 32-битное число со знаком: -2,147,483,648

Таким образом, у вас есть массив из трех элементов, каждый из которых содержит минимальное значение, которое может дать вам система.


Рейтинг:
2

KarstenK

Эта строка слева является объявлением, а справа-инициализацией массива. Это обычный код C++, но он должен быть написан в виде одной строки. Важно знать, что длина списка в скобках должен подходит к размеру массива.

См. какую-нибудь статью о инициализатор массива.


Рейтинг:
2

Jochen Arndt

Это то же самое, что

int a[3] = {-2147483648, -2147483648 , -2147483648};
То 0x префикс указывает, что следующие цифры интерпретируются как шестнадцатеричные. Для инициализации массива см. Инициализация массива - cppreference.com[^].

Вы также можете использовать
#include <limits.h>

int a[3] = {INT_MIN, INT_MIN, INT_MIN};


OriginalGriff

* кашель * отрицательный, а не положительный: INT_MIN, а не INT_MAX. * кашель*

Jochen Arndt

Черт!
Не следует постить до первой чашки кофе (особенно в субботу утром).
Но это показывает, почему лучше использовать определения.

Спасибо Грифф

OriginalGriff

У меня все время одна и та же проблема! :смеяться:

Рейтинг:
2

Patrice T

Цитата:
У меня есть приблизительное представление о том, как работает массив, но чего я не понимаю, так это этой строки.
int a[3] = {0x80000000 , 0x80000000 , 0x80000000};

Это то же самое, что:
int a[3] = {-1 , -1 , -1};

он инициализирует массив a с заданными значениями, просто это не так -1.
Шестнадцатеричный-Википедия[^]
Запись шестнадцатеричных и Восьмеричных значений в C[^]
-----
Научитесь правильно делать отступы в вашем коде, это покажет его структуру и поможет чтению и пониманию.
#include <stdio.h>

int main(void)
{
    int a[3] = {0x80000000 , 0x80000000 , 0x80000000};
    int i , j , k;
    for ( i = 0 ; i < 10 ; ++i )
    {
        int tmp;
        scanf("%d",&tmp);
        for(j=0 ; j<3;++j)
        {
            if(tmp>a[j])
            {
                int k;
                for(k=2;k>j;--k)
                {
                    a[k]=a[k-1];
                }
                a[j] = tmp;
                break;
            }
        }
    }
    printf("%d %d %d\n",a[0] , a[1] , a[2]);
    return 0;
}

Профессиональные редакторы программистов имеют эту функцию и другие, такие как сопоставление скобок и подсветка синтаксиса.
Notepad++ Home[^]
личные[^]