LINUX.ORG.RU

История изменений

Исправление 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