Все три (вероятно) эквивалентны, но по разным причинам.
bfh.bfType=0x4D42;
Это проще всего понять, он просто загружает bfType числом, которое соответствует ASCII 'M' в битах 8-15 и ASCII 'B' в битах 0-7. Если вы записываете это в поток в формате с прямым порядком байтов, тогда поток будет содержать «B», «M».
bfh.bfType='MB';
Это по сути эквивалентно первому утверждению - это просто другой способ выражения целочисленной константы. Вероятно, это зависит от того, что именно с ним делает компилятор, но он, вероятно, сгенерирует значение в соответствии с порядком номера машины, на которой вы компилируете. Если вы компилируете и выполняете на машине с тем же порядком байтов, то когда вы записываете значение в поток, вы должны получить «B», «M».
bfh.bfType=*(WORD*)"BM";
Здесь "BM" заставляет компилятор создать блок данных, который выглядит как 'B', 'M', '\ 0', и получает символ *, указывающий на него. Затем он преобразуется в WORD *, чтобы при разыменовании он считывал память как WORD. Следовательно, он читает «B», «M» в bfType в любой последовательности, в которой находится машина. Запись этого с использованием того же порядка байтов, очевидно, поместит «B», «M» в ваш поток. Пока вы используете только bfType для записи в поток, это самая переносимая версия. Однако, если вы выполняете какие-либо сравнения / etc с bfType, то, вероятно, лучше выбрать для него порядок байтов и при необходимости преобразовать при чтении или записи значения.