在C++中将unsigned int转换为int和long

vngu2lb8  于 2023-08-09  发布在  其他
关注(0)|答案(1)|浏览(143)
#include <iostream>

using namespace std;

void fun1(int off) {
  cout << "fun1 " << off << endl;
}

void fun2(long off) {
  cout << "fun2 " << off << endl;
}

int main() {
  unsigned int a;
  a = 50;
  fun1(-a);
  fun2(-a);

  return 0;
}

字符串
此程序的输出:

fun1 -50
fun2 4294967246


如果我改变unsigned int a--> unsigned long a,输出都是-50。
这种行为是否定义明确?相关规则是什么?
注意:我使用64位Linux,所以int是4个字节,long是8个字节。编译器是gcc 12。

qyuhtwio

qyuhtwio1#

所有结果都是实现定义的,因为类型的大小是实现定义的。
在您的系统上,我假设CHAR_BIT == 8sizeof(int) == 4sizeof(long) == 8。在这些假设范围内:

  • -a的值总是4294967246,类型为unsigned int
  • fun2的情况被很好地定义为4294967246long的范围内。
  • fun1的情况不同,因为4294967246超出了int的范围:
  • C++20起,定义为-50
  • 在C++20之前,实现自定义。

相关问题