我使用的是 Ubuntu 16.04.5 和 GCC 版本 5.4.0。
我在玩sizeof()
运营商,写了下面的代码:
#include <stdio.h>
int main(int argc, char *argv[]){
long int mylint = 31331313131.1313;
printf("size of long int is %d\n", sizeof(mylint));
printf("size of long int is %d\n", sizeof(long int));
return 0;
}
我尝试使用gcc -o ... ...
命令进行编译并期待:
size of long int is 8
size of long int is 8
但我收到以下错误:
fl_double_lint.c: In function ‘main’:
fl_double_lint.c:11:9: warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘long unsigned int’ [-Wformat=]
printf("size of long int is %d\n", sizeof(mylint));
^
fl_double_lint.c:12:9: warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘long unsigned int’ [-Wformat=]
printf("size of long int is %d\n", sizeof(long int));
当我%ld
改用它时,它按预期工作。为什么sizeof()
不合作%d
?(为什么是' long unsigned int
'而不是' int
'?)
编辑:我知道有很多关于 sizeof() 运算符输出的问题(如评论中所建议的那样)。但是,他们没有回答为什么 using%d
不起作用(即没有给出任何结果)的问题。我知道这不是正确的格式,但是每当我们使用char
类型变量时,我们都%d
可以得到等效int
的结果,简而言之,uint8_t、uint16_t、uint32_t 也是如此(通常用于等于或小于 32 位的类型)。以下代码有效:
#include <stdio.h>
#include <stdint.h>
int main(int argc, char *argv[]){
char mychar = 'd';
uint32_t myuint32 = 32;
uint16_t myuint16 = 16;
uint8_t myuint8 = 8;
short myshort = 26945;
int myint = 100;
printf("integer equivalent of mychar is %d\n", mychar);
printf("integer equivalent of myuint8 is %d\n", myuint8);
printf("integer equivalent of myuint16 is %d\n", myuint16);
printf("integer equivalent of myuint32 is %d\n", myuint32);
printf("character equivalent of myint is %c\n", myint);
printf("integer equivalent of myshort is %d\n", myshort);
return 0;
}
结果是:
integer equivalent of mychar is 100
integer equivalent of myuint8 is 8
integer equivalent of myuint16 is 16
integer equivalent of myuint32 is 32
character equivalent of myint is d
integer equivalent of myshort is 26945
现在我发现这%d
不适用于需要存储大于 32 位的任何变量。在考虑了这个问题之后,我对 的实现依赖性有了一些想法size_t
,也许在我的系统中它是unsigned long
(%ld
也给出了结果证明了这一点)。所以也许如果size_t
在unsigned int
我的系统中我会得到一个结果,是真的吗?
从上面的代码可以看出,%c
将最后 8 位解码int
为一个字符,为什么%d
不这样做(即按原样解码size_t
变量内容的最后 32 位int
?我相信如果它会这样做我们可以对于足够小的数字得到相同的结果,这就是我最初问这个问题时的意思)。