Почему значение TCHAR изменяется, если используется многобайтовый набор символов? - PullRequest
0 голосов
/ 29 октября 2019

Вот мой код:

int main()
{
    TCHAR x = 0x80;
    printf("%X", x);
    return 0;
}

Если я использую «Набор символов = Использовать многобайтовый набор символов» в настройках проекта Visual Studio, я получаю вывод:

FFFFFF80

Тот же код, созданный с помощью «Набор символов = Использовать набор символов Юникод», дает правильный вывод:

80

Почему это другое поведение?

1 Ответ

1 голос
/ 30 октября 2019

Для многобайтового набора символов: TCHAR обозначает char. В компиляторе Microsoft char является 8-битным типом.

Для набора символов Unicode: TCHAR обозначает wchar_t. В компиляторе Microsoft wchar_t представляет 16-битный широкий символ

видя "FFFFFF", потому что char подписан в вашей системе. В C такие функции, как printf, будут преобразовывать все целые числа, меньшие, чем int, в int. Поскольку char является целым числом, ваши символы повышаются до int через расширение знака.

Поскольку "80" имеет начальный 1-бит, они расширяются до знака.

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

    printf("%X", x & 0xFF);
...