Печать нескольких символов в формате целого числа - PullRequest
0 голосов
/ 02 июля 2018

Каждый раз, когда я запускаю эту программу, она выдает 12592 . Я не мог найти логику за этим. Это это в C Программирование.

#include <stdio.h>

int main()
{

    printf("%d",'10');

    return 0;
}

Ответы [ 3 ]

0 голосов
/ 02 июля 2018

В C (и C ++) символ апострофа ' используется для формирования символьной константы . Обычно между апострофами идет один символ как 'A', или escape-последовательность, представляющая один символ, например '\n' или '\001' или '\x01'.

По историческим причинам допустимо помещать несколько фактических символов между апострофами, как в 'AB' или в случае, о котором вы спрашивали, '10'. Это так называемые многосимвольные символьные константы .

Это сомнительная вещь. В результате реализация определена , что означает, что она может делать разные вещи под разными компиляторами (хотя документация должна рассказать вам, что она делает). Это также может сильно отличаться между C и C ++.

Поскольку он не совсем четко определил, что он делает, и поскольку его мало используют, даже если он был четко определен, обычный совет - просто не использовать многосимвольные символьные константы. (И если вы не используете их, вам даже не нужно знать, что они делают.)

В большинстве компиляторов Си то, что вы получаете, когда вы делаете это, является результатом "добавления" двух символов в память, то есть создания 16-разрядного числа, помещая два 8-разрядных числа рядом друг с другом. (На данный момент я предполагаю, что в многосимвольной константе только два символа, хотя на самом деле их может быть даже больше) Проще всего это объяснить на примере:

#include <stdio.h>

int main()
{
    printf("%d (%02x) %d (%02x) -> %d (%02x)\n", 'A', 'A', 'B', 'B', 'AB', 'AB');
    printf("%d (%02x) %d (%02x) -> %d (%02x)\n", '1', '1', '0', '0', '10', '10');
}

На моей машине это печатает

65 (41) 66 (42) -> 16706 (4142)
49 (31) 48 (30) -> 12592 (3130)

(Но, заметьте, на моем компьютере мой компилятор выдает мне сообщение «предупреждение: многосимвольная символьная константа», усиливая представление о том, что многосимвольные константы обычно плохая идея.)

Просмотр второго примера как байтов в памяти; «1» выглядит как

+------+ +----------+
| 0x31 | или | 00110001 |
+------+ +----------+

А '10' выглядит как

+------+------+ +----------+----------+
| 0x31 | 0x30 | или | 00110001 | 00110000 |
+------+------+ +----------+----------+

Откуда пришло это число 12592? Это десятичное представление шестнадцатеричного числа 0x3130. Или, говоря иначе, это 256 × 49 + 48.

0 голосов
/ 02 июля 2018

Как и все остальные, вы используете многосимвольную константу , и их объяснения говорят вам, ПОЧЕМУ вы получаете результат, который вы получили, как и было предложено.

Если вы намеревались распечатать целочисленный литерал значение 10 (пока что непосредственно не прокомментировано), используйте

printf("%d",10);

Обратите внимание, что во втором параметре нет одинарных кавычек.

В этом отношении

printf("10");

OR

printf("%s","10");

(напечатайте строковый литерал ) будет также хорошо.

0 голосов
/ 02 июля 2018

'10' на самом деле многосимвольная константа.

Он имеет тип int, как, скажем, '1', но его фактическое значение , определенное реализацией .

Вполне возможно, что его значение равно '1' * 256 + '0', что на вашей платформе равно 12592, что, насколько я могу судить, использует кодировку ASCII .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...