sizeof和隐式类型转换
sizeof和隐式类型转换我们知道sizeof 的操作数如果不是类型是表达式的时候可以省略掉后边的括号的。sizeof 后边的表达式是不真实参与运算的根据表达式的类型来得出大小。sizeof 的计算结果是size_t 类型的。那么。我们接下来来看看下面几段代码。inta0;intb0;intc0;cab;printf(%zd\n,sizeof(int));printf(%zd\n,sizeofa);printf(%zd\n,sizeofc);printf(%zd\n,sizeofab);printf(%zd\n,sizeof(cab));//printf(%zd\n, sizeof c a b);printf(%zd\n,sizeof(cab));printf(%zd\n,sizeof(33.5));printf(***********************************\n);printf(%zd\n,sizeof33.5);printf(***********************************\n);当编译代码的时候编译器会报错。“printf”: 格式字符串“%zd”需要类型“unsigned __int64”的参数但可变参数 1 拥有了类型“double。就是这个代码printf(%zd\n,sizeof33.5);我们运行结果来看一下发现其他的结果都是正常的但最后一个结果是一个非常大的数字这是因为什么呢虽然当sizeof后面是表达式的时候是可以忽略括号的。这里其实有着一个运算符优先级的问题。我们很快就发现sizeof 运算符 运算符所以在VS2022中默认是:(sizeof 3) 3.53是int在64位环境下sizeof(3)是4。类型是size_t。%zd专门用来打印 size_tVS2022下等价unsigned __int64然后与 3.5 运算size_t 和 double做加法发生隐式类型转换size_t 转化为double整个表达式的结果都是double类型。但是我们使用%zd来打印需要unsigned __int64”的参数。所以编译器才会报错“printf”: 格式字符串“%zd”需要类型“unsigned __int64”的参数但可变参数 1 拥有了类型“double%zd要求传入一个size_t。但这里我却放了一个double类型的进去。这两种数据在内存里的二进制存储格式是完全不一样的uint64纯整数二进制double符号位 阶码 尾数浮点格式printf不会自动转换只会直接把8块字节空间当成无符号整数来解读。所以会看到超大的数字。若要正常运行可以这样写:printf(%f\n,sizeof33.5);printf(%lf\n,sizeof33.5);printf(“%zd\n”, sizeof c a b);这个代码其实也是一样的道理。sizeof c 是一个常量值。常量不能放在赋值运算符 左边直接编译报错。“”: 左操作数必须为左值