#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。
1条答案
按热度按时间qyuhtwio1#
所有结果都是实现定义的,因为类型的大小是实现定义的。
在您的系统上,我假设
CHAR_BIT == 8
、sizeof(int) == 4
和sizeof(long) == 8
。在这些假设范围内:-a
的值总是4294967246
,类型为unsigned int
。fun2
的情况被很好地定义为4294967246
在long
的范围内。fun1
的情况不同,因为4294967246
超出了int
的范围:-50