【问题标题】:I need to assign a variable with a 64-bit value我需要分配一个 64 位值的变量
【发布时间】:2010-12-10 10:05:39
【问题描述】:

如果我定义一个结构 x1 然后分配一个无符号整数 xyz:64,它会创建一个 64 位整数,对吗?

现在,如果我想让所有的都在 64 位,以下工作是否可行:

x1.xyz = 1

这个值会用 64 个 1 填充变量吗?如果有任何其他方式来定义变量并为其赋值,建议我。

请帮忙

提前致谢。

【问题讨论】:

  • 你应该使用unsigned long long xyz:64

标签: c++ c


【解决方案1】:

这将用位模式000...001 填充它。导致111...111 位模式的值是-1

【讨论】:

  • -1 只是 111...1111 如果你的机器使用补码数
  • @rve:虽然这是真的,但我怀疑这里的许多人将不得不为不需要的人编程。
  • @rve:机器是否对有符号数使用两个补数并不重要,因为.xyz 是无符号数。将-1 分配给无符号整数会得到UINT_MAX。见stackoverflow.com/questions/809227/…
【解决方案2】:

使用 NOT 操作 (~) 可能是输入最少的操作:

unsigned int x = ~0 ;

但是我不完全确定是否有办法确保它在不进行某种类型转换的情况下填充 64 位,如下所示:

__int64 y = ~ (__int64)0 ;

【讨论】:

  • 您建议的按位否定不是获得全为向量的正确策略。 0signed int 类型,~0 也是。根据符号表示 ~0 可以是所谓的陷阱表示。正确的初始化是-1。这始终保证为您提供任何无符号类型的最大值。无符号类型的算术是这样进行的。
  • 这似乎与我没有二进制补码一样可能。你总是可以输入 ~ 0U (带有 U 扩展名)来确定对吗?另一种方法也是使用 numeric_limits,无论哪种方式都应该是 100% 安全的。
  • ~0U 可能会导致值 0000....1111(32 个零,32 个),具体取决于 unsigned intunsigned long long 的大小。你需要0ULL
【解决方案3】:

将 1 分配给 x1.xyz 将导致 63 位 0 和 1 位 1,十六进制为 0x0000000000000001 你应该这样做: x1.xyz = 0xFFFFFFFFFFFFFFFF

【讨论】:

    【解决方案4】:

    尝试将 -1 分配给无符号整数最多会导致编译器警告。您必须将 -1 强制转换为您尝试分配的类型。

    另一种方法是将值显式指定为 0xFFFFFFFFFFFFFFFFU。

    【讨论】:

      【解决方案5】:

      您应该为 64 位无符号整数使用标准类型,即uint64_t,即

      #include <stdint.h>
      
      struct MyStruct
      {
          uint64_t xyz;
      };
      
      // in the code somewhere
      
      struct MyStruct x1;
      x1.xyz = ~0;
      // or
      x1.xyz = 0xFFFFFFFFFFFFFFFF;
      

      【讨论】:

      • 如果我并不总是对 64 位感兴趣,那么假设我的结构有一个只有 17 位的元素并且我需要将所有 17 位分配为 1,该怎么办?感谢您的回复。
      • @user537670:对于大多数编译器,这两个想法中的任何一个都仍然有效。前 15 位将被简单地丢弃。
      【解决方案6】:

      没有

      这会将 1 分配给变量,二进制格式为:

      0000000000000000000000000000000000000000000000000000000000000001
      

      要分配所有的,你必须使用无符号类型的最大值(在 c++ 中应该是无符号的 __int64)

      我认为最大值是

      18,446,744,073,709,551,615
      

      据此:http://msdn.microsoft.com/en-us/library/s3f49ktz(VS.80).aspx

      【讨论】:

      • 每个读到它的人都会立即明白,那个 long long 数字不是一个幻数,而是实际上将所有位设置为 1。使用 (uint64_t)-10xFFFFFFFFFFFFFFFFU 更具可读性。在某些头文件或其他文件中的某处可能有一个合适的#define。
      • 任何问这个的人都会知道十六进制数字是什么,十六进制 F 表示二进制中的 15 或 11111111...
      • 我希望如此,如果不是,他们可以问。当然,知道 0xFFFFFFFFFFFFFFFF 意义的编程人群的比例大于知道 18,446,744,072,709,551,615 意义的编程人群的比例。此外,十进制版本更容易打错,也更难发现打错了。
      【解决方案7】:

      int 作为位域是否被签名由实现定义。所以首先你应该使用signedunsigned 来指定这个。

      但是,如果您总是只对 64 位感兴趣(编译器可能支持也可能不支持位域),那么您应该明确地使用“stdint.h”中的 uint64_t(或 int64_t)类型.那么,使用位域对我来说没有多大意义。

      如果您没有,请在您的平台上为适当的 64 位类型执行 typedef,您以后可以轻松替换或放入 #ifdef 子句。

      【讨论】:

      • 我一直对 64 位不感兴趣。那我该怎么办??
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-02-13
      • 2015-05-30
      • 2015-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-21
      相关资源
      最近更新 更多