当前位置: 首页 > 知识库问答 >
问题:

C标准对位于目标类型范围之外的类型的转换值的结果说了什么?

仲皓君
2023-03-14

最近,我不得不执行一些从< code>float到16位整数的数据类型转换。本质上,我的代码简化为以下内容

float f_val = 99999.0;
short int si_val = static_cast<short int>(f_val);

// si_val is now -32768

这个输入值是一个问题,在我的代码中,我忽略了检查浮点值的限制,所以我可以看到我的错误,但它让我想知道当一个人必须进行这种笨拙的转换时,语言的确切规则。我有点惊讶地发现cast的值是-32768。此外,每当浮点值超过16位整数的限制时,我都会得到这个值。我曾在谷歌上搜索过这个,但发现令人惊讶的是缺乏关于它的详细信息。我能找到的最好的是cpluplus.com上的以下内容:

从一些较小的整数类型转换为int,或从float转换为double称为提升,并保证在目标类型中产生完全相同的值。算术类型之间的其他转换可能并不总是能够精确表示相同的值:

If the conversion is from a floating-point type to an integer type, the value 
is truncated (the decimal part is removed).
The conversions from/to bool consider false equivalent to zero (for numeric 
types) and to null pointer (for pointer types); and true equivalent to all 
other values.
Otherwise, when the destination type cannot represent the value, the conversion 
is valid between numerical types, but the value is
implementation-specific (and may not be portable).

这个结果是由实现定义的建议并没有让我感到惊讶,但是我听说cplusplus.com并不总是可靠的。

最后,当执行从32位整数到16位整数的相同转换时(同样使用16位范围的值outisde),我看到了清楚指示整数溢出的结果。尽管我对此并不感到惊讶,但由于与<code>float</code>类型的转换不一致,这增加了我的困惑。

我无法访问C标准,但这里有很多C人这样做,我想知道标准在这个问题上说了什么?为了完整起见,我使用的是g版本4.6.3。

共有1个答案

邓兴为
2023-03-14

你有权质疑你读到的东西。转换没有定义的行为,这与您在问题中引用的内容相矛盾。

4.9浮点积分转换[conv.fpint]

1浮点类型的prvalue可以转换为整数类型的prvalue。转换截断;即丢弃小数部分。如果截断的值不能在目标类型中表示,则行为未定义。[注意:如果目标类型是bool,请参阅4.12。--结束说明]

您可能得到的一个潜在有用的许可结果是崩溃。

 类似资料:
  • 我们前面已经看到 Option 枚举可以用于函数可能失败的返回值,其中 None 可以返回以表明失败。但是有时要强调为什么一个操作会失败。为达成这点,我们提供了 Result 枚举。 Result<T, E> 枚举拥有两个变量: Ok(value) 表示操作成功,并装包操作返回的 value(value 拥有 T 类型)。 Err(why),表示操作失败,并装包 why,它(能按照所希望的方式)解

  • 本文向大家介绍说说你了解的类型转换?相关面试题,主要包含被问及说说你了解的类型转换?时的应答技巧和注意事项,需要的朋友参考一下 reinterpret_cast:可以用于任意类型的指针之间的转换,对转换的结果不做任何保证

  • 5.5 结果的类型转换 类型转换(Formatter机制)是WebMagic 0.3.2增加的功能。因为抽取到的内容总是String,而我们想要的内容则可能是其他类型。Formatter可以将抽取到的内容,自动转换成一些基本类型,而无需手动使用代码进行转换。 例如: @ExtractBy("//ul[@class='pagehead-actions']/li[1]//a[@class='socia

  • 到现在我们已经实现了我们那点唱机的一部分代码,我们看到了数组,哈希,方法,但我们还没有涉及到Ruby中其他的数据类型:数字,字符串,范围(ranges),正则表达式。下面我们就要花些时间来看看这些类型。 数字型Ruby 支持整型和浮点型两种数字类型。整型可以是任意长度(最大值由你机器的内存大小决定)。在一定范围内(通常是-230 to 230-1 or -262 to 262-1)在内部由二进制方

  • 本文向大家介绍准确说出'1,2,3,4'.split()的结果是什么(包括类型和值)?相关面试题,主要包含被问及准确说出'1,2,3,4'.split()的结果是什么(包括类型和值)?时的应答技巧和注意事项,需要的朋友参考一下 上面的同学说的第二个参数的含义有一点错误 运行结果为 ,是一个长度为1的Array,元素类型为String。 关于函数,其可以接受两个参数,第一个参数是字符串或正则表达式,

  • 本文向大家介绍说说你对数据类型转换的理解是什么?类型转换的方法有哪些?相关面试题,主要包含被问及说说你对数据类型转换的理解是什么?类型转换的方法有哪些?时的应答技巧和注意事项,需要的朋友参考一下 这个题有点大,,,写几个常用的吧 String to Number Number(str) +str Number to String toString(num) ''+num All to Boolea