Почему я могу скомпилировать это в 32-битной, а не 64-битной? - PullRequest
3 голосов
/ 14 февраля 2011
user@user:~/langs/c$ cat 3264int.c 
#include <stdio.h>
int main(){
        long z; 
    printf("Long int size is %d bytes long!\n", sizeof(z)); 

    return 0;
}
user@user:~/langs/c$ cat 3264int.c ^C
user@user:~/langs/c$ gcc -m32 -o 32int 3264int.c 
user@user:~/langs/c$ gcc -m64 -o 64int 3264int.c 
3264int.c: In function ‘main’:
3264int.c:4: warning: format ‘%d’ expects type ‘int’, but argument 2 has type ‘long unsigned int’ cat 3264int.c

Я попытался изменить тип для z на int, но он все еще не компилируется

Ответы [ 2 ]

5 голосов
/ 14 февраля 2011

Это предупреждение, а не ошибка. Вы получили исполняемый файл. Однако, если вы пытаетесь скомпилировать с -pedantic или -Werror, вы не сможете. Однако если вы работаете с этим микропримером, вам нужно изменить спецификатор формата на %ld. На вашей платформе size_t, то есть то, что вернет sizeof, это, вероятно, 8 байт на 64-битной, но 4 байта на 32-битной. %d может отображать 32-разрядное целое, но не 64-разрядное целое.

4 голосов
/ 14 февраля 2011

Оператор sizeof возвращает size_t. На вашей платформе в 32-битных сборках по размеру он равен 32-битному целому (т. Е. Скорее всего это целое число без знака или длинное целое без знака, оба из которых, вероятно, 32-битные для 32-битной сборки) , В 64-битных сборках это длинное целое число без знака, которое 64-битное. % d для целых, а 32-битные как для 32-битных, так и для 64-битных сборок.

Обойти эту дилемму можно следующим образом:

Приведите результат sizeof к четко определенному платформо-независимому типу - unsigned int или, что еще лучше, unsigned long, и затем используйте "% u" или "% lu", соответственно, в качестве символа форматирования printf.

Или вы можете:

Используйте спецификацию форматирования% zu, , которая напрямую поддерживает size_t .

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