union
и struct
работают еще как отличимо.ObjectPos
имеет размер 2 байта и выравнивание на 2 байта. Оба его поля размещаются в этих двух байтах, адреса этих полей одинаковы и размеры тоже одинаковы - 2 байта.ObjectPos
допускается задать значение одного поля и прочитать его же из другого поля. Документация дает исчерпывающее понимание этого формата.struct
- все поля имеют свой собственный адрес, упакованы согласно своему выравниванию и занимают свою уникальную память согласно своему собственному размеру.struct ObjectPos {
unsigned short x;
unsigned short y;
};
ObjectPos
был бы уже 4 байта, т.к. оба поля имели бы в структуре свою собственную память.std::unordered_map
[?] являются по умолчанию: наличие достижимого инстанцирования шаблона std::hash
и оператора эквивалентности.std::unordered_map
, использовав свои типы вместо типов по умолчанию.Не понимаю зачем это нужно, ведь оно же ищет по хеш-функции определенной выше
std::unordered_map
будет искать среди ключей с одинаковым хэшем эквивалентный искомому. In any case, if the value of the right operand is negative or is greater or equal to the number of bits in the promoted left operand, the behavior is undefined.
( size_t( s.x ) << 16 )
. и мне нужно по x и y находить их
Можно конечно ObjectPos заменить на обычный int и написать функцию которая будет из двух short'ов делать один int
union
от struct
?0
.1 / 2
представляет собой целочисленное деление.o
имеет целочисленный тип и в коде pow(*(*(a + i) + j), 1/o)
выполняется целочисленное деление, результатом которого у тебя будет или 1
, или 0
в большинстве случаев. Любое число в нулевой степени равно 1
, поэтому у тебя "Все время 1 получается".Otherwise, if E1 has a signed type and non-negative value, and E1 × 2^E2 is representable in the result type, then that is the resulting value; otherwise, the behavior is undefined.
1 / 2
. И почему будет именно так, как будет.1 / 2
? Почему результат будет именно таким? For example, when reading a 16-bit value on a 64-bit machine, a full 64 bits worth of data must still be read from memory.
потому что операции с частью регистра требуют вспомогательных действий
ah
и al
- это ровно такие же регистры, как и ax
их объединяющий, как и eax
вмещающий в себя ax
, как и rax
вмещающий в себя eax
. Это все - регистры. Просто они означают разные диапазоны одного и того же набора бит.