Разъяснение различных спецификаторов формата в программе на C - PullRequest
0 голосов
/ 13 ноября 2018

Я не понимаю, в чем главное различие между %p, %u, %x, %d, за исключением того, что %x показывает шестнадцатеричное, %u используется для целого числа без знака и что %d являетсядля любого целого числа.Я очень запутался после того, как я взял целочисленную переменную и напечатал ее адрес и ее значение (положительное целое число) отдельно, а затем независимо от того, какой спецификатор формата я использую, он правильно печатал выходные данные (за исключением разницы в шестнадцатеричной и десятичной системе счисления).).Так в чем же основное отличие?

И если нет большой разницы, то какие спецификаторы формата предпочтительнее для печати, какой тип переменных?

Еще одно сомнение заключается в следующем: является ли указатель всей кратности (Я имею в виду int *p; int **p; int ***p; и т. Д.) Занимают тот же размер (какой размер необходим для хранения действительного адреса в аппарате)?Если нет, то каков размер этих указателей?

Спасибо за вашу помощь.

Ответы [ 2 ]

0 голосов
/ 13 ноября 2018

С помощью спецификаторов формата вы сообщаете компьютеру, как интерпретировать данную переменную / данные.

Быстрое демо:

#include <stdio.h>

int main(void)
{
    int x = -5;
    printf("x value as int: [%d]\n", x);
    printf("x value as unsigned int: [%u]\n", x);
    printf("x value as hexadecimal: [%x]\n", x);
    printf("x value as pointer: [%p]\n", x);

    return 0;
}

Вывод:

x value as int: [-5]
x value as unsigned int: [4294967291]
x value as hexadecimal: [fffffffb]
x value as pointer: [0xfffffffb]

Это то же значение, которое дается каждый раз, то есть x = -5.

  • Мы видим точное представление, если дан правильный спецификатор формата (первый случай).

  • Во втором случае мы видим очень большое число,Ответ на вопрос «Почему» немного длинен, чтобы объяснить здесь, но вы должны посмотреть, как отрицательные целые числа представлены в системе дополнения 2.

  • В третьем случае мы видим шестнадцатеричное представлениечисла 4294967291.Шестнадцатеричные числа обычно отображаются с 0x в начале, но %x не делает этого.

  • Последнее просто показывает, как будет выглядеть переменная x, если бы она былаадрес в памяти, опять же в шестнадцатеричном формате, конечно.

0 голосов
/ 13 ноября 2018

Спецификаторы формата %u, %x, %d и %p используются следующим образом:

  • %u: ожидает unsigned int в качестве параметра и печатает его в десятичном формате.
  • %x: ожидает unsigned int в качестве параметра и печатает его в шестнадцатеричном формате.
  • %d: ожидает int в качестве параметра и печатает его в десятичном формате.
  • %p: ожидает void * в качестве параметра и печатает его определенным для реализации способом (обычно в виде шестнадцатеричного числа)

Кроме того, %u, %x, %d могут иметь префикс с модификатором длины:

  • l: обозначает long int или unsigned long int
  • ll: обозначает long long int или unsigned long long int
  • h: обозначает short int или unsigned short int
  • hh: обозначает signed char или unsigned char

Что касается размеров указателя, int *, int **, int *** и т. Д. Не обязательно должны быть одинакового размера, хотя в большинстве реализаций они будут.

...