Почему я получаю то же значение при печати этого int? - PullRequest
5 голосов
/ 23 октября 2010

Так что я просто возился с C и хотел посмотреть, могу ли я присвоить двоичное значение целому числу и использовать функцию printf () для вывода значения со знаком или без знака. Но независимо от того, что я получаю один и тот же вывод, я думал, что получу половину стоимости печати со знаком по сравнению с неподписанным. Я использую Code :: blocks и GCC.

Неужели printf () игнорирует% i &% u и использует определение переменной?

Пример кода:

#include <stdio.h>
#include <stdlib.h>

int main()
{
    signed int iNumber = 0b1111111111111111;
    printf("Signed Int : %i\n", iNumber);
    printf("Unsigned Int : %u\n", iNumber);

    return 0;
}

Тот же результат, если я изменяю int на unsigned:

#include <stdio.h>
#include <stdlib.h>

int main()
{
    unsigned int iNumber = 0b1111111111111111;
    printf("Signed Int : %i\n", iNumber);
    printf("Unsigned Int : %u\n", iNumber);

    return 0;
}

Ответы [ 5 ]

6 голосов
/ 23 октября 2010

Я полагаю, charCount должно быть iNumber. Обе программы имеют неопределенное поведение, так как вы используете неправильный спецификатор преобразования один раз.

На практике (для большинства реализаций) printf полагается на то, что вы скажете ему, что вытолкнуть из стека; это необходимо, потому что это переменная функция аргумента. va_arg принимает тип для всплытия в качестве второго параметра

Биты одинаковы между программами до и после назначения. Так что printf указывает на одни и те же биты с указателями разных типов.

Причина, по которой вы получаете одинаковый результат для %i и %u, заключается в том, что крайний левый бит не установлен, поэтому он интерпретируется как положительный для обоих спецификаторов.

Наконец, вы должны отметить, что двоичные литералы (0b) являются расширением GCC, а не стандартным C.

3 голосов
/ 23 октября 2010

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

2 голосов
/ 23 октября 2010

Во-первых, вы, кажется, печатаете что-то, называемое charCount, без ошибок, и этот b способ указания числа не является стандартным C. Я проверю, чтобы убедиться, что он делает то, что вы думаете,Для стандартного способа задания битовых комбинаций, подобных этому, используйте восьмеричный (число начинается с нуля) или шестнадцатеричный (число начинается с нуля и x) формат.

Во-вторых, почти все компьютеры имеют одинаковые двоичные файлыпредставление для положительного целого числа и его беззнакового эквивалента, поэтому не будет никакой разницы.Будет различие, если число отрицательное, и это обычно зависит от старшего значащего бита.Ваши int могут быть любого размера от 16 бит и более, хотя на настольном компьютере, ноутбуке или сервере это очень вероятно 32, и почти наверняка либо 32, либо 64.

В-третьих, printf() знаетничего о типе данных, которые вы передаете ему.При вызове он даже не способен знать размеры своих аргументов или их количество.Это вытекает из спецификаторов формата, и если они не согласны с переданными аргументами, могут возникнуть проблемы.Это, наверное, худшая вещь о printf().

0 голосов
/ 23 октября 2010

У вас, вероятно, есть 32-битные целые. В этом случае это означает, что ваш iNumber имеет значение 32767 независимо от того, подписано оно или нет.

0 голосов
/ 23 октября 2010

Результат будет отличаться только для значений выше 0x7FFFFFFF, поскольку почти во всех системах используется бит с наибольшим весом, который используется для маркировки знака.Для более быстрых вычислений внутри ЦП остальные биты инвертируются, поэтому 0xFFFFFFFF равно -1, а 0x80000000 равно -MAXINT-1, а 0x7FFFFFFF равно MAXINT.

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