gpt4 book ai didi

c++ - 为什么表达式 (int) +1e10 不会产生 CSAPP 描述的 -2147483648?

转载 作者:行者123 更新时间:2023-12-04 08:25:57 26 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





Bizarre floating-point behavior with vs. without extra variables, why?

(4 个回答)



Is the behaviour of casting a negative double to unsigned int defined in the C standard? Different behaviour on ARM vs. x86

(1 个回答)



Double cast to unsigned int on Win32 is truncating to 2,147,483,648

(3 个回答)


9 个月前关闭。




我正在阅读 CS:APP (x86-64 汇编/低级教科书),它提到:

From float or double to int, the value will be rounded toward zero.For example, 1.999 will be converted to 1, while −1.999 will beconverted to −1. Furthermore, the value may overflow. The C standardsdo not specify a fixed result for this case. Intel-compatiblemicroprocessors designate the bit pattern [10 ... 00] (TMinw for wordsize w) as an integer indefinite value. Any conversion from floatingpoint to integer that cannot assign a reasonable integer approximationyields this value. Thus, the expression (int) +1e10 yields -2147483648,generating a negative value from a positive one.


什么是 Intel 兼容微处理器 这里提到了? x86架构包括AMD系列?
无论如何,我有一台带有 Win10 64 位机器的 Intel i5,我在 Visual Studio 下尝试过:
    #include <iostream>
using namespace std;

int main() {
int b = (int)+1e10;
cout << b << endl;
}
并得到 1410065408作为输出。
我也试过 int32_t并得到 1410065408也。
那么为什么我没有结果 -2147483648这是 [10 ... 00]正如书中描述的那样?

最佳答案

即使使用的处理器具有“无法分配合理的整数近似值的任何从浮点数到整数的转换都会产生此值。”,编译器也不需要遵循这一点,因为它可以使用其他代码来实现目标。
特别是,可以在编译器时确定的值,如 some_32_bit_int = (int)+1e10;可能会得到类似 some_32_bit_int = 10000000000 & 0xFFFFFFFF; 的值或 1410065408完全独立于处理器。

If the value of the integral part cannot be represented by the integer type, the behavior is undefined. C17dr § 6.3.1.4 1


这本书描述的是处理器,而不是编译器。

关于c++ - 为什么表达式 (int) +1e10 不会产生 CSAPP 描述的 -2147483648?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65260691/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com