首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么这个C代码会生成double而不是float?

这个问题涉及到C语言的类型转换规则。在C语言中,当浮点数和整数相除时,结果会自动转换为浮点数类型(double),而不是float类型。这是因为在C语言中,整数和浮点数之间的运算会自动执行类型提升,将整数类型转换为浮点数类型。因此,如果要得到float类型的结果,需要在代码中进行显式类型转换。

例如,以下代码将得到double类型的结果:

代码语言:c
复制
int a = 1;
float b = 2.0;
float c = a / b;

而以下代码将得到float类型的结果:

代码语言:c
复制
int a = 1;
float b = 2.0;
float c = (float)(a / b);

在这个例子中,通过在除法运算前加上强制类型转换操作符((float)),可以将结果转换为float类型。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Java 中的为什么SIZE仅为整数和长整数@Native?

指示可以引用定义常量值的字段 来自本机代码。注释可被以下工具用作提示: 生成本机头文件以确定头文件是否 必需的,如果是,它应该包含什么声明。...然而,在阅读Java源代码时,我注意到在类@Native和Integer中,Long常量是SIZE不是浮点、字节、双、短和字符。 请注意,大小常量表示用于表示实际值的位数。...注释应该直接应用于需要导出的常量字段,不是整个类。 这些东西的目的是: javac可以为包含本机方法的类生成本机头。...正如预期的那样,为Integer和Long生成的头文件(多亏了Integer)和Long生成的头文件(多亏了它们的本地方法),但不是为@Native、Float生成的头文件。...-name "*.cpp" \) -exec grep "java_lang_Short.h" {} \; -print 也不是Float,也不是Double

81231

C++打怪升级(八)- 泛型编程初见

基于类似这样的原因,C++提出了泛型编程的概念,我们只需要写出一个函数模板不是具体的函数,我们直接使用这个函数模板,具体的函数由编译器自动生成; ---- 泛型编程是啥 编写与类型无关的通用代码,是代码复用的方法之一...---- 函数模板 概念 函数模板代表了一个函数家族,与具体类型无关,在使用时被参数化,编译器根据实参类型产生函数的特定类型版本 格式 C++模板引入了新关键字template表示模板; 对于函数模板参数类型并不是具体的类型...型时 typedef只能满足其中一种类型,不是多种; 类模板随之而来,利落的解决了这个问题,达到了我们想创建哪个类型的类都可以的目的。...,实例化的结果才是真正的类(也就是类模板名加上具体的类型是真正的类名); 这里有个问题,类模板实例化为什么必须在其后加上呢?...或者说为什么我们需要指定类模板实例化的类型不是像函数模板实例化那样由编译器推导类型再实例化呢?

79220

你可能不知道的printf

你是否会有以下疑问: 0.打印0的a/b为什么不是1,a为什么不是4? 1.打印1和打印2有什么区别呢? 2.打印3为什么结果会是0.000000? 3.打印4的结果为什么最后的小数位不对?...4.打印5中,为什么a的值是-1不是4? 5.打印6中,结果为什么分别是6,6,4? 在解答这些问题之前,我们需要先了解一些基本内容。...例如,%f期望一个double(8字节)类型,但是传入的参数是int(4字节),那么在处理这个int参数值,可能多处理4个字节,并且也造成处理数据错误。...真相大白 有了前面这些内容的铺垫,我们再来解答开始的疑问: 对于问题0,a/b的结果显然为4字节的int类型1,%f期望的是8字节的double计算结果只有4个字节,因此继续格式化后面4个字节的...绝对避免出现计算结果与参数计算顺序有关的代码。 *在printf中实现可变域宽和精度。 printf不会实际接受到char,short和float类型参数。

43110

深入剖析Java中的装箱和拆箱

如果要生成一个数值为10的Integer对象,只需要这样就可以了: Integer i = 10; 这个过程中会自动根据数值创建对应的 Integer对象,这就是装箱。...上面的代码中i1和i2的数值为100,因此直接从cache中取已经存在的对象,所以i1和i2指向的是同一个对象,i3和i4则是分别指向不同的对象。 2.下面这段代码的输出结果是什么?...在这里只解释一下为什么Double类的valueOf方法会采用与Integer类的valueOf方法不同的实现。很简单:在某个范围内的整型数值的个数是有限的,浮点数却不是。...DoubleFloat的valueOf方法的实现是类似的。...当然,这个题目属于比较宽泛类型的。但是要点一定要答上,我总结一下主要有以下这两点区别:   1)第一种方式不会触发自动装箱的过程;第二种方式触发;   2)在执行效率和资源占用上的区别。

53710

java基础提升篇:深入剖析Java中的装箱和拆箱

但是事实上输出结果是: true false 为什么会出现这样的结果?输出结果表明i1和i2指向的是同一个对象,i3和i4指向的是不同的对象。...上面的代码中i1和i2的数值为100,因此直接从cache中取已经存在的对象,所以i1和i2指向的是同一个对象,i3和i4则是分别指向不同的对象。 2.下面这段代码的输出结果是什么?...这里写图片描述 在这里只解释一下为什么Double类的valueOf方法会采用与Integer类的valueOf方法不同的实现。很简单:在某个范围内的整型数值的个数是有限的,浮点数却不是。...DoubleFloat的valueOf方法的实现是类似的。...当然,这个题目属于比较宽泛类型的。但是要点一定要答上,我总结一下主要有以下这两点区别: 1)第一种方式不会触发自动装箱的过程;第二种方式触发; 2)在执行效率和资源占用上的区别。

34920

Java的装箱和拆箱,你掌握到了第几层?

下表是基本数据类型对应的包装器类型: int(4字节) Integer byte(1字节) Byte short(2字节) Short long(8字节) Long float(4字节) Float double...上面的代码中i1和i2的数值为100,因此直接从cache中取已经存在的对象,所以i1和i2指向的是同一个对象,i3和i4则是分别指向不同的对象。 2.下面这段代码的输出结果是什么?...在这里只解释一下为什么Double类的valueOf方法会采用与Integer类的valueOf方法不同的实现。很简单:在某个范围内的整型数值的个数是有限的,浮点数却不是。...DoubleFloat的valueOf方法的实现是类似的。...当然,这个题目属于比较宽泛类型的。但是要点一定要答上,我总结一下主要有以下这两点区别: 第一种方式不会触发自动装箱的过程;第二种方式触发; 在执行效率和资源占用上的区别。

41620

深入剖析Java中的装箱和拆箱

上面的代码中i1和i2的数值为100,因此直接从cache中取已经存在的对象,所以i1和i2指向的是同一个对象,i3和i4则是分别指向不同的对象。 2.下面这段代码的输出结果是什么?...=i4); } }   也许有的朋友认为跟上面一道题目的输出结果相同,但是事实上却不是。...在这里只解释一下为什么Double类的valueOf方法会采用与Integer类的valueOf方法不同的实现。很简单:在某个范围内的整型数值的个数是有限的,浮点数却不是。...DoubleFloat的valueOf方法的实现是类似的。...当然,这个题目属于比较宽泛类型的。但是要点一定要答上,我总结一下主要有以下这两点区别:   1)第一种方式不会触发自动装箱的过程;第二种方式触发;   2)在执行效率和资源占用上的区别。

807140

一个由跨平台产生的浮点数bug | 有你意想不到的结果

问题背景 背景就简单点儿说,当初一个项目 C# 编写,涉及浮点运算,来龙去脉省去,直接看如下代码。(为什么这个问题产生,是因为当初线上产生了很诡异的问题,和本地调试效果不一致。)...看下编译后生成代码(截取关键部分) //C# x86 下 ...... float p3x = 80838.0f; 0000003b mov dword ptr [ebp-40h],479DE300h...C++ x86 / x64下都生成了类似的代码(这也就是为何 C++ x86/x64与C#x64结果一致)即都用了先用浮点乘起来(mulss),然后转成double(cvtss2sd)。...从上面的汇编代码可以看出 C# X86生成代码用的指令fld/fmul/fstp等。...所以大家在写代码的时候得保证实际运行环境/测试环境/开发环境的一致性(包括OS架构啊、编译选项等)啊,不然莫名其妙的问题产生(本文就是开发环境与运行环境不一致导致的问题,纠结了好久才发现是这个原因);

1.5K30

Python内置(3)exec&eval、globals&locals、input&print、5个基本类型、object

您只需要告诉ast.parse和compile期望评估此代码的值,不是像Python文件一样运行它。...下面用一段代码说明: def double(number): return number * 2 这个函数的代码对象将存储常量2,以及变量名称number,但它显然不能包含number 的实际值...它所做的只是告诉print立即将文本写入控制台/文件,不是将其放入缓冲区中。...它也是其他 2 种数据类型的最低公分母:float和complex 。 complex是 float的超类型, float又是int 的超类型。...从它们的“祖先”可以看出,所有其他数据类型都不是任何东西的“子类”(除了object,它将永远存在)。bool 继承自int 。 现在,在这一点上,您可能想知道“为什么

53120

C++构造函数的作用_c++什么是构造函数

对象在生成时,一定会自动调用某个构造函数进行初始化,对象一旦生成,就再也不会在其上执行构造函数。 初学者常因“构造函数”这个名称认为构造函数负责为对象分配内存空间,其实并非如此。...double r, double i); //设置实部和虚部 }; 上面这个 Complex 类代表复数,没有编写构造函数,因此编译器会为 Complex 类自动生成一个无参的构造函数。...对示例1中的代码,如果写作Student stu或者new Student就是错误的,因为类中包含了构造函数,创建对象时却没有调用。...默认构造函数 如果用户自己没有定义构造函数,那么编译器自动生成一个默认的构造函数,只是这个构造函数的函数体是空的,也没有形参,也不执行任何操作。...实际上编译器只有在必要的时候才会生成默认构造函数,而且它的函数体一般不为空。默认构造函数的目的是帮助编译器做初始化工作,不是帮助程序员。

1.4K20

公司同事用floatdouble,结果导致..

BigDecimal 阿粉相信大家对这个肯定不陌生,只要你公司的业务中涉及到一些比较精确的数字的时候,都会使用 BigDecimal,不会去使用 Floatdouble,并且在数据库做设计的时候...,如果是小数类型,也是让你使用 BigDecimal 不是 floatdouble。..."f"或"F",为了和double区别 我们来写一段简单的程序来实验一下为什么它不行 System.out.println(2.0-1.4); 如果是有经验的开发人员,肯定觉得这么写出来是不是有问题...这个时候就有人问了,我定义 float 类型为 1.4 的时候为什么不是 1.399999999呢?这就是不进行浮点计算的时候,在十进制里浮点数能正确显示。...这就是为什么有些面试官在面试基础的时候,很多次问,floatdouble 都会丢失精度,BigDecimal 丢失精度么?为什么

79240

EasyC++30,函数指针从进阶到放弃……

这里其实有一个疑问,为什么这两种方式都可以执行呢?这是因为当我们执行auto p2 = f2的时候,其实是执行的auto p2 = &f2,C++隐式地将函数转换成函数的地址。...首先我们可以想到,这个声明是基于pt的,我们需要在pt的声明上加上一个*,但问题是加在哪里呢? 进一步分析,会发现我们需要指出这是一个指针,不是数组。...而且这还不是最复杂的情况,比如函数的返回类型又是一个指向一个函数的指针……明摆着告诉我们含义我们仍然要推敲一,如果在一段不明的代码当中遇到,可能直接抓狂吧…… 也正因此,C++11当中推出了auto...多说一句题外话,golang语言当中将变量的类型放在变量的后面不是前面,其中一个原因就是为了解决类似情况的复杂性。...*[3]func([]float64, int) *float64 = &pt; 很明显,虽然变量类型写在变量后面刚开始不太习惯,但是很明显这样要清晰很多。

15610

解了这十道C语言题,你敢说你精通C语言?

而对于第一个,为什么输出0,我们需要了解一下floatdouble的内存布局,如下: float: 1位符号位(s)、8位指数(e),23位尾数(m,共32位)。...然后,我们还需要了解一下printf由于类型不匹配,所以,会把float直接转成double,注意,12.5的floatdouble的内存二进制完全不一样。...这个示例向我们说明printf并不是类型安全的,这就是为什么C++要引如cout的原因了。 5 下面的程序输出是多少?并解释为什么?...但是第三个为什么输出的不是11呢?居然还是10?...对于(条件1 || 条件2),如果“条件1”为true,“条件2”的表达式则被忽略了。 所以,我相信你知道本题的答案是什么了。 10 下面的C程序是合法的吗?

47730

解了这十道C语言题,你敢说你学过C语言?

而对于第一个,为什么输出0,我们需要了解一下floatdouble的内存布局,如下: float: 1位符号位(s)、8位指数(e),23位尾数(m,共32位)。...然后,我们还需要了解一下printf由于类型不匹配,所以,会把float直接转成double,注意,12.5的floatdouble的内存二进制完全不一样。...这个示例向我们说明printf并不是类型安全的,这就是为什么C++要引如cout的原因了。 5 下面的程序输出是多少?并解释为什么?...但是第三个为什么输出的不是11呢?居然还是10?...对于(条件1 || 条件2),如果“条件1”为true,“条件2”的表达式则被忽略了。 所以,我相信你知道本题的答案是什么了。 10 下面的C程序是合法的吗?

4543330

计算机程序的思维逻辑 (3) - 基本运算

: long a = 2147483647*2L; 另外,需要注意的是,整数相除不是四舍五入,而是直接舍去小数位,例如: double d = 10/4; 结果是2不是2.5,如果要按小数进行运算,...小数计算结果不精确 无论是使用float还是double,进行运算时都会出现一些非常令人困惑的现象,比如: float f = 0.1f*0.1f; System.out.println(f); 这个结果看上去...首先,它使用两个等号==,不是一个等号(=),为什么不用一个等号呢?因为一个等号(=)已经被占了,表示赋值操作。...另外,对于数组,==判断的是两个数组是不是同一个数组,不是两个数组的元素内容是否一样,即使两个数组的内容是一样的,但如果是两个不同的数组,==依然返回false,如下所示: int[] a = new...这个例子我们还可以看出,自增/自减操作带给我们的困扰,别的操作都干干脆,赋值就赋值,加法就加法,比较就比较,它非混在一起,可能少写些代码,但如果使用不当,会使理解困难很多。

60790

解了这十道C语言题,你敢说你学过C语言?

而对于第一个,为什么输出0,我们需要了解一下floatdouble的内存布局,如下: float: 1位符号位(s)、8位指数(e),23位尾数(m,共32位)。...然后,我们还需要了解一下printf由于类型不匹配,所以,会把float直接转成double,注意,12.5的floatdouble的内存二进制完全不一样。...这个示例向我们说明printf并不是类型安全的,这就是为什么C++要引如cout的原因了。 5 下面的程序输出是多少?并解释为什么?...但是第三个为什么输出的不是11呢?居然还是10?...对于(条件1 || 条件2),如果“条件1”为true,“条件2”的表达式则被忽略了。 所以,我相信你知道本题的答案是什么了。 10 下面的C程序是合法的吗?

3632118

Oracle Java Numbers和Strings

如果参数不是“null”,并且是具有相同类型和数值的对象,则方法返回“true”。Java API文档中对“Double”和“Float”对象有一些额外的要求。...转换器 Flag 解释 d 十进制整数 f A float. n 适用于运行应用程序的平台的新行字符。您应该始终使用“%n”,不是“\n”。 tB 日期和时间转换区域设置特定的月份全名。...---- 一个例子 标题为“字符串”的部分中列出的“StringDemo”程序是一个程序的示例,如果使用“StringBuilder”不是“String”,该程序的效率更高。...值作为基元类型不是“Integer”对象添加到“li”中,但代码仍会编译。...因为“li”是“Integer”对象的列表,不是“int”值的列表,所以您可能会想为什么Java编译器不会发出编译时错误。

18300

CUDA优化冷知识24|函数和指令使用的选择和优化

手册本节指出了,当B是编译时刻的2^N形式的常数的时候,编译器自动发现这一点,同时自动为你进行这个优化。...并讨论了C语言默认为有符号整数时候,编写代码的人如果偷懒不写上unsiged字样,则在循环控制变量和下标计算上,将生成较为劣化的代码。...然后下一小节手册从上面两个相似名字的数学运算函数(结尾带有f和不带有它)开始,说了容易不小心将float写成double,并生成double运算代码,导致速度降低很多的情况。...主要有这两点: (1)读者写代码的时候,如果不小心,使用1.0,不是1.0f这样的常数,根据C的规则,含有这个常数的式子,将在运算过程中,提升到double进行运算,式子算完后,再转换回来成float...注意这个快速替换表格里的公式,很多都使用了特殊的GPU上专用的函数,例如rsqrt, rcbrt(二次方和三次方根的倒数),不是标准的C库(libm),在CPU上我们能见到的sqrt、cbrt(二次方和三次方根

99620
领券