C++ 如果我将一个带小数点的数字赋给一个整数而不是浮点,会发生什么?
早些时候,我的一位朋友问了我这个问题,但我发现自己在拼命给他一个充分的解释。浮点或双精度浮点将被截断。因此2.99将变为2,-2.99将变为-2 标准中的相关章节(第4.9节) 1浮点类型的prvalue可以转换为prvalue 整数类型。转换截断;也就是说,分数 零件被丢弃。如果截断的值 无法在目标类型中表示C++ 如果我将一个带小数点的数字赋给一个整数而不是浮点,会发生什么?,c++,C++,早些时候,我的一位朋友问了我这个问题,但我发现自己在拼命给他一个充分的解释。浮点或双精度浮点将被截断。因此2.99将变为2,-2.99将变为-2 标准中的相关章节(第4.9节) 1浮点类型的prvalue可以转换为prvalue 整数类型。转换截断;也就是说,分数 零件被丢弃。如果截断的值 无法在目标类型中表示 浮点或双精度浮点将被截断。因此2.99将变为2,-2.99将变为-2 标准中的相关章节(第4.9节) 1浮点类型的prvalue可以转换为prvalue 整数类型。转换截断;也就是说,分
浮点或双精度浮点将被截断。因此2.99将变为2,-2.99将变为-2 标准中的相关章节(第4.9节) 1浮点类型的prvalue可以转换为prvalue 整数类型。转换截断;也就是说,分数 零件被丢弃。如果截断的值 无法在目标类型中表示
如果将任何数值类型(整数、浮点)的值指定给另一数值类型的对象,则该值将隐式转换为目标类型。在初始化或向函数传递参数时也会发生同样的情况 如何进行转换的规则因您使用的类型而异 如果目标类型可以准确表示值:
short s = 42;
int i = s;
double x = 42.0;
int j = x;
表示法可能有所改变,但数学值不变
如果一个浮点类型被转换为整数类型,并且该值不能被表示,那么它就会被截断,正如@sashang的回答所说的——但是如果被截断的值不能被表示,那么行为就没有定义
将整数(有符号或无符号)转换为无符号类型会导致值按模减少MAX+1
,其中MAX
是无符号类型的最大值。例如:
unsigned short s = 70000; // sets s to 4464 (70000 - 65536)
// if unsigned short is 16 bits
如果值不合适,则将整数转换为有符号类型是由实现定义的。它通常以类似于无符号类型的方式进行包装,但该语言不能保证这一点。如果将任何数值类型(整型、浮点型)的值分配给另一数值类型的对象,该值将隐式转换为目标类型。在初始化或向函数传递参数时也会发生同样的情况 如何进行转换的规则因您使用的类型而异 如果目标类型可以准确表示值:
short s = 42;
int i = s;
double x = 42.0;
int j = x;
表示法可能有所改变,但数学值不变
如果一个浮点类型被转换为整数类型,并且该值不能被表示,那么它就会被截断,正如@sashang的回答所说的——但是如果被截断的值不能被表示,那么行为就没有定义
将整数(有符号或无符号)转换为无符号类型会导致值按模减少MAX+1
,其中MAX
是无符号类型的最大值。例如:
unsigned short s = 70000; // sets s to 4464 (70000 - 65536)
// if unsigned short is 16 bits
如果值不合适,则将整数转换为有符号类型是由实现定义的。它通常以一种类似于无符号类型的方式进行包装,但该语言不能保证这一点。您尝试过吗?@Beta为什么尝试它会有帮助?如果它是UB,那么尝试它对你没有任何帮助。是因为我,还是因为你可以愉快地将一个浮点赋值给一个int,这并不令人沮丧。我不需要尝试它,因为我已经知道会发生什么。我简直想不出该怎么说。你试过吗?@Beta为什么试过会有帮助?如果它是UB,那么尝试它对你没有任何帮助。是因为我,还是因为你可以愉快地将一个浮点赋值给一个int,这并不令人沮丧。我不需要尝试它,因为我已经知道会发生什么。我简直想不出该怎么说。你应该展示消极的情况,也可能是违反直觉的。谢谢!出于某种原因,我用了一个艰难的取舍类比,但他只提出了一连串的问题。(“那为什么不起来呢?…等等)实际上,使用truncated会让他更清楚。@DavidHeffernan:如果被截断的值不能在目标类型中表示,这是未定义的。好的,我明白了。抱歉!尽管如此,使用负值的示例还是很有趣的。@DavidHeffernan:这可能是因为shell解释该程序返回值的方式。-2变成254。你应该展示否定的情况,也可能是违反直觉的。谢谢!出于某种原因,我使用了一个艰难的取舍类比,但他只提出了一连串的问题。(“为什么不向上呢?…等等)实际上,使用truncated会让他更清楚。@DavidHeffernan:如果被截断的值不能在目标类型中表示,这是未定义的。好的,我明白了。很抱歉尽管如此,使用负值的示例还是很有趣的。@DavidHeffernan:这可能是因为shell解释该程序返回值的方式-2变成254。