Операции приведения типов С++

155
06 апреля 2018, 18:51

Всем привет. Изучая книгу Бьярне Страуструпа, я наткнулся на интересный, по моему мнению, пример:

class Tiny {
 char v;
 void assign(int i) { 
  if(i&~077)               // #1
   throw Bad_range();
  v = i;
 }
public:
 class Bad_range{};
 Tiny(int i) { assign(i); }
 Tiny& operator = (int i) { assign(i); return *this; }
 operator int() const { return v; }
};

int main () {
 Tiny c1 = 2;
 Tiny c2 = 1;
 Tiny c3 = c1 - c2;       // #2
}

Так вот, первый вопрос(# 1), что это за условие, так как я вижу его впервые. И (# 2), выражение (c1 - c2) превратится в тип int или Tiny? И будет ли разница в производительности, если не учитывать второй вопрос?

Answer 1

077 - число в восьмеричной системе счисления, которое бинарно записывается как 00..00111111 - нули до размера int. Операция ~ обращает все биты, т.е. получается 11..11000000. Операция побитового И с таким числом даст true (ненулевое значение) при наличии в числе хотя бы одного единичного бита начиная с 6 (считая от нуля). Так что это проверка, что число от 0 до 63 включительно (как для беззнаковых, так и для знаковых чисел), вернее, что число вне этого диапазона - тогда генерируется исключение.

Во второй части c1 и c2 для разности будут приведены к типу int (оператор int()), и результат вычитания типа int будет использован для создания объекта c3 типа Tiny (конструктор Tiny(int)).

READ ALSO
Возникла проблема с задачей

Возникла проблема с задачей

Не понимаю, что не так с моим алгоритмом, но на сайте выдает что ошибка на одном из тестов проверкиОшибка в реализации алгоритма или в самом...

193
Почему не решается задача.Стек,С++

Почему не решается задача.Стек,С++

Всем приветЕсть задача , если запустить через консоль , то всё выдает как нужно

207