Как работать с левым и правым байтами короткого int?

У меня есть короткий int, который составляет 2 байта, но я хочу вывести в файл только левый байт. Как мне это сделать? Я использую бинарные функции open(), read(), write() и т.д.

Я также хотел бы сдвинуть правый байт влево 8 раз, чтобы правый байт занимал левый, а правый был очищен до всех 0-х.

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


person user1472747    schedule 16.02.2013    source источник
comment
вам нужно будет показать некоторые попытки ...   -  person Mitch Wheat    schedule 16.02.2013
comment
Изучите побитовые операторы и поэкспериментируйте! Вы также должны помнить, что левая и правая часть значения во многом зависит от базовой платформы (читайте о порядке байтов< /а>).   -  person Some programmer dude    schedule 16.02.2013
comment
Взгляните на graphics.stanford.edu/~seander/bithacks.html для вдохновения. . Но никогда не забывайте, что случайная стоимость нескольких микросекунд времени выполнения намного меньше, чем целый день, потраченный на то, чтобы почесать голову, потому что вы больше не понимаете, как работает код. Напишите простейший код, который выполняет эту работу, убедитесь, что он соответствует стандарту (ваш компилятор и машина изменятся!). Начинайте бездельничать только тогда, когда измерения показывают, что это того стоит, и компилятор не делает этого сам. Организация и алгоритмы должны быть вашими первыми объектами пристального внимания.   -  person vonbrand    schedule 16.02.2013
comment
Нет. Короткое целое — это sizeof (short int) байт. Это значение не обязательно равно 2. Существуют системы, в которых sizeof (short int) == 1. @JoachimPileborg: глупо поощрять эксперименты со сдвигом отрицательных целых чисел. Сдвиг влево отрицательных значений является неопределенным поведением, а сдвиг вправо может привести к представлениям ловушки или исключительным условиям, которые согласно 6.2.6.1p5 и 6.5p5 также могут привести к неопределенному поведению.   -  person autistic    schedule 16.02.2013


Ответы (1)


Вы можете попробовать этот подход

    int someNum = 0x1234;
    int  leftByte, rightByte;

    leftByte = (someNum >> 8) & 0xff;
    rightByte = (someNum) & 0xff;
person Ganesh    schedule 16.02.2013
comment
Не используйте шорты. Они дают очень мало пользы. Вместо этого используйте целые числа. stackoverflow.com/questions/13589183/ - person SecurityMatt; 16.02.2013
comment
Спасибо. Я использовал short int для указания типа данных 16 bit по желанию пользователя. Я изменю свой пример, чтобы использовать только int - person Ganesh; 16.02.2013
comment
Я предлагаю обрабатывать отрицательные значения отдельно от положительных значений. - person autistic; 16.02.2013
comment
@modifiedlvalue Из вопроса я предполагаю, что пользователь ожидает извлечь два 8-битных значения из 16-битного значения, аналогично операции распаковки. Следовательно, я не уверен, что исходный вопрос также предназначался для обработки знаков - person Ganesh; 16.02.2013