Вычитание между подписанным и неподписанным с последующим делением

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

? callback =? & amp; ошибка =?

Это называется JSONPE, но это вовсе не стандарт defacto.

Затем провайдер передает информацию в функцию ошибки, чтобы помочь вам диагностировать.

Не помогает с ошибками в сообщении, хотя - jQuery нужно будет обновить, чтобы также вызвать функцию ошибки при тайм-ауте, как в ответе Адама Беллэра.

24
задан autistic 16 January 2016 в 01:28
поделиться

2 ответа

IIRC, арифметическая операция между подписанным и беззнаковым int будет давать неподписанный результат.

Таким образом, 20 - 80u выдает результат без знака, эквивалентный -60: если unsigned int является 32-битным типом, этот результат равен 4294967236.

Кстати, присвоение i1 приводит к определенному реализацией результату , потому что число слишком велико, чтобы уместиться. Получение -60 типично, но не гарантировано.

13
ответ дан Hurkyl 16 January 2016 в 01:28
поделиться

Бинарные арифметические операторы будут выполнять обычные арифметические преобразования для своих операндов, чтобы привести их к общему типу.

В случае i1, i3 и i5 общим типом будет unsigned int , и поэтому результатом также будет unsigned int . Числа без знака будут переноситься по арифметике по модулю, поэтому вычитание немного большего значения без знака приведет к числу, близкому к целому числу без знака, которое не может быть представлено целым числом.

Таким образом, в случае i1 мы получаем преобразование, определяемое реализацией, поскольку значение не может быть представлено. В случае i3 деление на 2 возвращает значение без знака обратно в диапазон int, и в результате мы получим большое значение int со знаком после преобразования.

Соответствующие разделы из проекта стандарта C ++ следующие. Раздел 5.7 [expr.add] :

Аддитивные операторы + и - группируют слева направо. Обычные арифметические преобразования выполняются для операндов арифметического или перечислимого типа.

Обычные арифметические преобразования описаны в разделе 5, где говорится:

Многие бинарные операторы, которые ожидают операнды арифметического или перечислимого типа, вызывают преобразования и приводят к типам результата в аналогичном путь. Цель состоит в том, чтобы получить общий тип, который также является типом результата. Этот шаблон называется обычными арифметическими преобразованиями, которые определяются следующим образом:

[...]

  • В противном случае, если операнд с целочисленным типом без знака имеет ранг больше или равный рангу типа другого операнда, операнд с целочисленным типом со знаком должен быть преобразован в тип операнда с целочисленным типом без знака.

и для преобразования из значения, которое не может быть представлено для подписанного типа, раздел 4.7 [conv.integral] :

Если тип назначения подписан, значение не изменяется, если оно может быть представлено в типе назначения (и ширине битового поля); в противном случае значение определяется реализацией.

и для целых чисел без знака подчиняется модулю арифметического раздела 3.9.1 [basic.fundamental] :

Целые числа без знака должны подчиняться законам арифметики по модулю 2n, где n это число битов в представлении значения этого конкретного размера целого числа.48

3
ответ дан Shafik Yaghmour 16 January 2016 в 01:28
поделиться
Другие вопросы по тегам:

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