【问题标题】:How to get long from int如何从 int 中得到 long
【发布时间】:2014-03-10 12:51:47
【问题描述】:

如何获取intlong 值?比如如何得到-127的long值?

【问题讨论】:

  • 请扩大问题。您可以将 int 分配给 long。所以从表面上看,你的要求是微不足道的。
  • 可能问题不清楚,但你不能简单地进行类型转换吗?

标签: c++ int long-integer


【解决方案1】:

如果您正在讨论具有前导 1 的负数的位表示,那么您可以使用:

int intValue = -127;
long longValue;
if((0x80 << (sizeof(int)-1)) & intValue)
{
    longValue = (0x80 << ((sizeof(long)-1)*8)) | ((0x80 << ((sizeof(int)-1)*8)) ^ intValue);
}else{
    longValue = intValue
}

我希望我没有弄乱括号。

【讨论】:

  • 完全是假的。首先,编译器会为您进行签名扩展。所以你只需要一个从signed intsigned long 的简单赋值。其次,sizeof(int) 返回字节大小。在 int 中将 0x80 向左移动多个字节是错误的,因为您需要的是多个位,而不是字节。
  • 没错,错过* 8,在数括号中被咳嗽了
  • 关键不在于*8,而在于根本不需要任何代码。我建议您删除答案,因为它非常具有误导性,不了解的新手会完全糊涂。
  • 他并没有真正询问如何为 long 变量分配 int 值,而是从 int 变量中获取 long 值,这就是我谈论“位表示”的原因。如果我没记错的话,我们在将有符号值包装在预定义的传输协议中时遇到了类似的问题。我知道你实际上可以“转换”这些值,但如果他接受了正确的答案,他可能真的在谈论位表示。只要问他:)
  • 编译器开发人员已经对其进行了编码和测试,为什么还要重新发明轮子呢?您的整个if 语句应替换为longValue = intValue。它给出了正确的位表示。你做的事情和赋值完全相同,只是你没有测试你的版本,一个足够聪明的编译器会将它降低为符号扩展无论如何。您的答案很可能被接受,因为提问者不知道更好。如果您不想使用长变量,只需编写一个函数即可。在那里,没有明确的变量,生活很好:)
【解决方案2】:
int foo = -127;
long bar = foo;
assert(bar == foo); // We simply state that the values are the same

或者:

// Decent compilers will optimize this away in release build.
long long_from_int(int x) { return x; }

int foo = -127;
assert(long_from_int(foo) == -127L);

就是这样。生活没有比这更容易的了:)

【讨论】:

    【解决方案3】:

    使用:Long.valueOf(int)

    或者,如果你有一个“整数”,你也可以这样做:

    整数 x = - 127; long y = x.longValue();

    【讨论】:

    • 这是什么?你是说 QVariant 吗?
    • 这是 Qt(使用 C++),而不是 Java
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多