Что означает «-1» в диапазоне значений для unsigned int и sign int?

Я рекомендую использовать glob с этой повторно используемой оболочкой. Он генерирует vector<string>, соответствующий путям файлов, которые соответствуют шаблону glob:

#include <glob.h>
#include <vector>
using std::vector;

vector<string> globVector(const string& pattern){
    glob_t glob_result;
    glob(pattern.c_str(),GLOB_TILDE,NULL,&glob_result);
    vector<string> files;
    for(unsigned int i=0;i<glob_result.gl_pathc;++i){
        files.push_back(string(glob_result.gl_pathv[i]));
    }
    globfree(&glob_result);
    return files;
}

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

vector<string> files = globVector("./*");
24
задан Boann 29 August 2019 в 12:14
поделиться

1 ответ

Где Вы находили этот неправильный абзац? Это, кажется, о 2's дополнение, но имеет -1 в неправильном месте.

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

В основном ничто никогда не использует это в эти дни, но стандарт ISO C указывает, что целые числа со знаком являются двоичными и используют или дополнение two, поразрядное дополнение до единицы или знак/величину.

<час>

В [1 114] 2's дополнение (почти универсальный в эти дни), диапазон представимых значений с помощью n биты является [-2 <глоток> n-1 , 2 <глоток> n-1 - 1]. Одна комбинация двоичных разрядов (весь нуль битов) представляет нуль значения. Каждый бит имеет значение места 2^i, кроме заключительного, которое имеет значение места -2^(n-1).

комбинация двоичных разрядов со всем набором битов представляет -1, потому что sum(2^i, i=0..n-1) один меньше чем 2^n.

С [1 117] только [1 117] набор знакового бита, мы получаем больше-всего-отрицательное-число : -INT_MIN подписывается переполнение (неопределенное поведение), потому что это не является представимым как int; это требует более широкого целого числа. Или с обертыванием, -INT_MIN = INT_MIN. Это "2's дополнительная аномалия". https://en.wikipedia.org/wiki/Two%27s_complement#Most_negative_number

можно постараться не расширяться при выполнении операции абсолютного значения: например,
unsigned abs = i >= 0 ? i : -(unsigned)i;

(Преобразование отрицательной величины к [1 111] в C имеет четко определенное поведение сокращения модуля, пока это не находится в представимом диапазоне. В C это независимо от кодирования целого числа со знаком; то, что имеет значение, значение . Так (uint8_t)-1 всегда 255. Для 2's дополняют, это просто копирует комбинацию двоичных разрядов. Для знака/величины или поразрядного дополнения до единицы реализация C должна была бы сделать некоторую математику для кастинга от со знаком до со знаком. Заметьте, что я сделал это прежде отрицание, что означает 0 - i с обычным неподписанным обертыванием.)

2
ответ дан 28 November 2019 в 17:57
поделиться
Другие вопросы по тегам:

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