#include <stdio.h>
int main() {
float a = 1234.5f;
printf("%d\n", a);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
它显示0
!! 怎么可能?是什么原因?
我故意%d
在printf
声明中加入研究行为printf
.
我正在尝试使用带有泛型类型的C stdarg.h lib.int类型,是我的泛型类型>要理解它,请继续阅读.所以,我的问题是:
我有一个函数接受可变数量的参数.喜欢
void function (int paramN, ...);
Run Code Online (Sandbox Code Playgroud)
在我的程序中,没有办法知道,哪个是变量参数的类型,它可以是char,数组,int,short,函数点等...就像
function (paramN, "Hey, I'm a string", 1, function_pint, array, -1); // -1 is a sentinel.
Run Code Online (Sandbox Code Playgroud)
所以,我认为,一个int,是32位,在x86(32位)系统中,这将保存所有内存地址.所以,如果我用int得到所有参数,那就不会有问题了,例如,"嘿,我是一个字符串"这个字符串的地址,通常适合32位变量,所以,我只需要制作演员.
我是正确的?
我可以做吗?
注意:我不想让我的函数像printf(这个解决方案,在这种情况下不适合好吗?)
谢谢你的回答.
抱歉我的英语不好.
今天我有一个奇怪的问题.
代码(C++)
#include <iostream>
union name
{
int num;
float num2;
}oblong;
int main(void)
{
oblong.num2 = 27.881;
std::cout << oblong.num << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
守则(C)
#include <stdio.h>
int main(void)
{
float num = 27.881;
printf("%d\n" , num);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
问题
众所周知,C++联合可以包含多种类型的数据元素,但一次只能包含一种类型.所以基本上name oblong
只会保留一部分32位的内存(因为联合中最大的类型是32位,int和float),这部分可以保存整数或浮点数.
所以我只需要将值27.881分配给oblong.num2
(如上面的代码所示).但出于好奇,我访问使用oblong.num
指向相同内存位置的内存.
正如预期的那样,它给了我一个不是27的值,因为浮点数和整数在内存中表示的方式是不同的,这就是为什么当我oblong.num
用来访问内存部分时它会把那部分内存值当作整数来解释它整数表示方式.
我知道这种现象也会在C中发生,这就是为什么我用一个值初始化一个浮点型变量然后用%d
.So 读取它.我只是尝试使用27.881
你在上面看到的相同值.但是当我运行它时,会发生一些奇怪的事情,那就是我在C中获得的值与C++不同.
为什么会这样?据我所知,我从两个代码到底得到的两个值不是垃圾值,但为什么我得到不同的值?我还使用sizeof来验证C和C++整数和浮点大小,两者都是32位.因此,内存大小不会导致这种情况发生,那么是什么促使这些值的差异?
int main()
{
int x=4;
int y=987634;
printf("%f %f",x,y);
}
Run Code Online (Sandbox Code Playgroud)
在编译此代码时,我得到一个0.000000 0.000000的输出.难道不存在x和y到浮点数的类型提升吗?O/P不应该是4.000000和987634.000000吗?谁能帮我这个.Thanx提前.