提问者:小点点

为什么-1等于整数-5的第4个字节?


为什么这段代码会推导出一个true(或者没有std::boolalpha)

   char* arr = new char[4];
   int* i = new (arr) int(-5);
   char c = -1;
   std::cout << std::boolalpha << (arr[3] == c) << std::endl; 

共2个答案

匿名用户

为什么这个代码会推导出一个真的

根据用于运行程序的系统,输出可能是真或假,或者程序的行为可能是未定义的。

在负数使用2的补码表示的系统中(这是非常常见的,而且从C++20开始就保证了),字节顺序是小顺序(这在桌面系统中比较常见,在其他地方不太常见),int的大小正好是4的系统中,恰好字节arr[3]的值是-1。 所有这些条件匹配的CPU体系结构的示例是x86,不匹配的示例是AVR32。

在大端系统上,情况并非如此,输出也不是真的。 在int的大小小于4个字节的系统上,该字节可以未初始化,在这种情况下,输出可以是true或false。 如果int的大小大于4字节,则程序的行为将未定义。

匿名用户

如果您在调试器中检查arr,您可能会看到它具有值0xFBFFFFFF。 如果您的计算机使用little-endian字节顺序,即最低有效字节存储在最低地址,则会出现这种情况。 为了使代码按照您的预期执行,您应该检查arr[0]。 此外,您所编写的代码可能会在使用大端字节顺序的计算机上按您所期望的那样执行。