【发布时间】:2018-08-12 07:36:03
【问题描述】:
当我尝试翻转数字 -9223372036854775808 的符号时,我发现了一个奇怪的错误,它根本没有任何作用。 我得到了相同的数字,或者至少这是调试器显示给我的。 有没有办法在不分支的情况下解决这个问题?
#define I64_MAX 9223372036854775807LL
#define I64_MIN (-I64_MAX-1)
// -9223372036854775808 (can not be a constant in code as it will turn to ull)
using i64 = long long int;
int main()
{
i64 i = I64_MIN;
i = -i;
printf("%lld",i);
return 0;
}
对 i32,i16,i8 做同样的事情。
编辑:
当前修复:
// use template??
c8* szi32(i32 num,c8* in)
{
u32 number = S(u32,num);
if(num < 0)
{
in[0] = '-';
return SerializeU32(number,&in[1]);
}
else
{
return SerializeU32(number,in);
}
}
【问题讨论】:
-
好吧,你在那里导致了未定义的行为。
-I64_MIN不能由您的long long int代表。你希望结果是什么? -
我知道您希望答案是肯定的,但您希望它是什么数值?
-
您是否尝试过使用转换器?您很快就会发现 9223372036854775808 是一个 65 位(有符号)数字,您希望它如何适应 64 位?
-
@MikeBorkland
using是 C++。用与 OP 使用的语言不同的语言对其进行标记有什么意义? -
@MikeBorkland OP 正在使用 C++,他对此有疑问。完全不同的语言恰好在这里具有相同的行为这一事实完全无关紧要。为什么应该使用错误语言的 OP 标签?
标签: c++ macos numbers int signed