Шестнадцатеричная нотация и целые числа со знаком

Эффективный подход заключается в использовании ассоциативных массивов bash 4.0:

#!/usr/bin/env bash
case $BASH_VERSION in ''|[123].*) echo "ERROR: Requires bash 4.0+" >&2; exit 1;; esac

declare -A input_fields_list=( [one]=1 [two]=1 [three]=1 [four]=1 [five]=1 )
declare -A req_fields_list=( [one]=1 [six]=1 [seven]=1 [eight]=1 )
declare -A non_input_fields_list=( [two]=1 [three]=1 [seven]=1 [eight]=1 [nine]=1 )

for xfr in "${!input_fields_list[@]}"; do
  [[ ${req_fields_list[$xfr]} ]] && continue
  [[ ${non_input_fields_list[$xfr]} ]] && continue
  echo "$xfr not found" >&2
  exit 1
done

echo "All input fields are valid" >&2
exit 0

Как вы можете видеть на https://ideone.com/IhmVKy , это правильно завершается с five not found.

11
задан Micha Wiedenmann 10 December 2018 в 09:54
поделиться

3 ответа

C# (скорее.NET) также использует дополнение two, но это поддерживает и подписанные и неподписанные типы (который Java не делает). Немного маски является более естественно неподписанной вещью - почему один бит должен отличаться, чем все другие биты?

В этом конкретном случае безопасно использовать бросок непроверенный:

int ALPHA_MASK = unchecked((int)0xFF000000);

Чтобы "непосредственно" представить это число как значение со знаком Вы пишете

int ALPHA_MASK = -0x1000000; // == -16777216

Шестнадцатеричный не (или не должен) несколько отличаться от десятичного числа: для представления отрицательного числа необходимо записать знак минус, сопровождаемый цифрами, представляющими абсолютное значение.

24
ответ дан 3 December 2019 в 02:41
поделиться

Ну, можно использовать блок непроверенный и бросок:

unchecked
{
    int ALPHA_MASK = (int)0xff000000;
}

или

int ALPHA_MASK = unchecked((int)0xff000000);

Не ужасно удобный, хотя..., возможно, просто используют литеральное целое число?

7
ответ дан 3 December 2019 в 02:41
поделиться

И, чтобы добавить оскорбления к травме, это тоже сработает:

-0x7F000000
0
ответ дан 3 December 2019 в 02:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: