Adh*_*rov 10 c ubuntu sizeof gcc5 ubuntu-16.04
我使用的是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;
}
Run Code Online (Sandbox Code Playgroud)
我尝试使用gcc -o ... ...命令编译并期待:
size of long int is 8
size of long int is 8
Run Code Online (Sandbox Code Playgroud)
但是我收到以下错误:
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));
Run Code Online (Sandbox Code Playgroud)
当我使用时,%ld它按预期工作.为什么sizeof()不合作%d?(为什么' long unsigned int但不是int'?)
编辑:我知道有很多关于sizeof()运算符输出的问题(如评论中所示).但是,他们没有回答为什么使用%d不起作用的问题(即不给出任何结果).我知道格式不正确,但每当我们使用char类型变量时我们都%d可以得到相同的int结果,对于short,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;
}
Run Code Online (Sandbox Code Playgroud)
结果是:
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
Run Code Online (Sandbox Code Playgroud)
现在我发现这%d对任何需要存储大于32位的变量都不起作用.在考虑了这个问题后,我对实现依赖性有了一些了解size_t,也许在我的系统中它unsigned long(%ld也给出了结果证明了它).因此,也许,如果size_t是一个unsigned int在我的系统,我会得到一个结果,是真的吗?
从上面的代码中可以看出,%c将最后8位解码int为一个字符,为什么%d不这样做(即解码size_t变量内容的最后32位int?我相信如果它能这样做我们可以得到相同的结果,足够小的数字,这就是我最初提出问题时的意思).
dbu*_*ush 25
的sizeof操作者的计算结果为类型的值size_t.此类型未签名且通常大于a int,这就是您收到警告的原因.
使用错误的格式说明符来printf调用未定义的行为.但是,对于小于C标准第6.3.1.1p2节中int的整数提升规则的类型,您可以使用此方法:
如果可以使用int或unsigned int,则可以在表达式中使用以下内容:
- 具有整数类型(int或unsigned int除外)的对象或表达式,其整数转换等级小于或等于int和unsigned int的等级.
- _Bool,int,signed int或unsigned int类型的位字段.
如果int可以表示原始类型的所有值(由宽度限制,对于位字段),则该值将转换为int; 否则,它将转换为unsigned int.这些被称为整数促销.整数促销不会更改所有其他类型.
因此,只要这不会导致从无符号到有符号的更改,小于int可以打印的类型%d.
正确的类型修饰符size_t是%zu,根据C标准的第7.21.6.1p7节关于fprintf函数的长度修饰符(以及扩展名printf):
ž
指定以下d,i,o,u,x或X转换说明符适用于
size_t或对应的有符号整数类型参数; 或者后面的n转换说明符适用于指向与size_t参数对应的有符号整数类型的指针.
所以你想要的是:
printf("size of long int is %zu\n", sizeof(mylint));
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
918 次 |
| 最近记录: |