История изменений
Исправление SZT, (текущая версия) :
ну и можно еще сдвинуть его влево как беззнаковое на такое количество бит, чтоб знаковый бит попал на знаковый бит, т.е
0b00000001 11111111 11111111 11111111 это -1
сдвигаем на 7 влево
0b11111111 11111111 11111111 10000000
потом https://en.wikipedia.org/wiki/Arithmetic_shift на 7 вправо
0b11111111 11111111 11111111 11111111 - получаем -1 для int32
uint32_t val; // тут хранится значение, которое надо перевести
const char shift = 8 * sizeof(uint32_t) - SIGN_BIT_POS;
return (int32_t)(val << shift) >> shift;
Исправление SZT, :
ну и можно еще сдвинуть его влево как беззнаковое на такое количество бит, чтоб знаковый бит попал на знаковый бит, т.е
0b00000001 11111111 11111111 11111111 это -1
сдвигаем на 7 влево
0b11111111 11111111 11111111 10000000
потом https://en.wikipedia.org/wiki/Arithmetic_shift на 7 вправо
0b11111111 11111111 11111111 11111111 - получаем -1 для int32
uint32_t val; // тут хранится значение, которое надо перевести
const char shift = 8 * sizeof(uint32_t) - SIGN_BIT_POS;
return (int32)(val << shift) >> shift;
Исправление SZT, :
ну и можно еще сдвинуть его влево как беззнаковое на такое количество бит, чтоб знаковый бит попал на знаковый бит, т.е
0b00000001 11111111 11111111 11111111 это -1
сдвигаем на 7 влево
0b11111111 11111111 11111111 10000000
потом https://en.wikipedia.org/wiki/Arithmetic_shift на 7 вправо
0b11111111 11111111 11111111 11111111 - получаем -1 для int32
uint32_t val; // тут хранится значение, которое надо перевести
const char shift_val = 8 * sizeof(uint32_t) - SIGN_BIT_POS;
return (int32)(val << shift) >> shift;
Исходная версия SZT, :
ну и можно еще сдвинуть его влево как беззнаковое на такое количество бит, чтоб знаковый бит попал на знаковый бит, т.е
0b00000001 11111111 11111111 11111111 это -1
сдвигаем на 7 влево
0b11111111 11111111 11111111 10000000
потом https://en.wikipedia.org/wiki/Arithmetic_shift на 7 вправо
0b11111111 11111111 11111111 11111111 - получаем -1 для int32