C поведение целочисленного переполнения при присвоении целым числам большей ширины

Я считаю, array_intersect - это то, что вам нужно.

array_intersect () возвращает массив, содержащий все значения array1, присутствующие во всех аргументах. Обратите внимание, что ключи сохранены.

blockquote>

Обратите внимание, что сравнение чувствительно к регистру.

Таким образом, вы можете преобразовать массив в нижний регистр, а затем выполнить array_intersect для них,

$haystack = [
    11 => 'Parenting',
    48 => 'How',
    50 => 'Parenting',
    54 => 'parenting',
    57 => 'parenting',
    58 => 'style',
    59 => 'that',
    60 => 'offers',
    61 => 'kids',
    62 => 'greater',
    63 => 'freedom',
];

$needle = ['Parenting', 'offer', 'freedom'];

$result = array_intersect(array_map('strtolower', $haystack), array_map('strtolower', $needle));

7
задан Chris Johnson 4 October 2009 в 08:28
поделиться

4 ответа

Проблема является на самом деле несколько сложной. Операнды арифметических выражений преобразовываются с помощью определенных правил, что Вы видите в Разделе 3.2.1.5 из Стандарта (C89). В Вашем случае ответ зависит от какой тип uint16_t . Если это меньше, чем int, сказать short int, затем операнды преобразовываются в int и Вы добираетесь-4000, но в 16-разрядной системе, uint16_t мог быть unsigned int и преобразования в тип со знаком не произошло бы автоматически.

5
ответ дан 7 December 2019 в 03:21
поделиться

Оба операнда продвинуты на int32_t во время вычитания. Если результат был больше, чем максимальное значение для int32_t Вы видели бы переполнение.

1
ответ дан 7 December 2019 в 03:21
поделиться

Существует, на самом деле, переполнение, но C не говорит Вам.

Переполнение оставляет значение, которое, оказывается,-4000 при интерпретации как целое число со знаком. Это работает, как разработано над 2's дополнительные машины.

Попытайтесь интерпретировать результат как неподписанный, и Вы заметите, что (u1-u2) оценивает к некоторому на вид несвязанному числу когда u1 <u2.

0
ответ дан 7 December 2019 в 03:21
поделиться

Короткий ответ - то, что они все продвинуты на int во время вычитания. Для длинного ответа посмотрите на раздел 6.3.1.1 из стандарта C, где он говорит о целочисленных продвижениях в арифметических выражениях. Соответствующий язык из стандарта:

Если int может представить все значения исходного типа, значение преобразовывается в int; иначе это преобразовывается в unsigned int. Их называют целочисленными продвижениями. Все другие типы неизменны целочисленными продвижениями.

Детали там также, но они становятся довольно противными.

3
ответ дан 7 December 2019 в 03:21
поделиться
Другие вопросы по тегам:

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