【发布时间】:2010-12-10 10:05:39
【问题描述】:
如果我定义一个结构 x1 然后分配一个无符号整数 xyz:64,它会创建一个 64 位整数,对吗?
现在,如果我想让所有的都在 64 位,以下工作是否可行:
x1.xyz = 1
这个值会用 64 个 1 填充变量吗?如果有任何其他方式来定义变量并为其赋值,建议我。
请帮忙
提前致谢。
【问题讨论】:
-
你应该使用
unsigned long long xyz:64
如果我定义一个结构 x1 然后分配一个无符号整数 xyz:64,它会创建一个 64 位整数,对吗?
现在,如果我想让所有的都在 64 位,以下工作是否可行:
x1.xyz = 1
这个值会用 64 个 1 填充变量吗?如果有任何其他方式来定义变量并为其赋值,建议我。
请帮忙
提前致谢。
【问题讨论】:
unsigned long long xyz:64
这将用位模式000...001 填充它。导致111...111 位模式的值是-1。
【讨论】:
.xyz 是无符号数。将-1 分配给无符号整数会得到UINT_MAX。见stackoverflow.com/questions/809227/…
使用 NOT 操作 (~) 可能是输入最少的操作:
unsigned int x = ~0 ;
但是我不完全确定是否有办法确保它在不进行某种类型转换的情况下填充 64 位,如下所示:
__int64 y = ~ (__int64)0 ;
【讨论】:
0 是 signed int 类型,~0 也是。根据符号表示 ~0 可以是所谓的陷阱表示。正确的初始化是-1。这始终保证为您提供任何无符号类型的最大值。无符号类型的算术是这样进行的。
unsigned int 和 unsigned long long 的大小。你需要0ULL。
将 1 分配给 x1.xyz 将导致 63 位 0 和 1 位 1,十六进制为 0x0000000000000001 你应该这样做: x1.xyz = 0xFFFFFFFFFFFFFFFF
【讨论】:
尝试将 -1 分配给无符号整数最多会导致编译器警告。您必须将 -1 强制转换为您尝试分配的类型。
另一种方法是将值显式指定为 0xFFFFFFFFFFFFFFFFU。
【讨论】:
您应该为 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;
【讨论】:
没有
这会将 1 分配给变量,二进制格式为:
0000000000000000000000000000000000000000000000000000000000000001
要分配所有的,你必须使用无符号类型的最大值(在 c++ 中应该是无符号的 __int64)
我认为最大值是
18,446,744,073,709,551,615
据此:http://msdn.microsoft.com/en-us/library/s3f49ktz(VS.80).aspx
【讨论】:
(uint64_t)-1 或 0xFFFFFFFFFFFFFFFFU 更具可读性。在某些头文件或其他文件中的某处可能有一个合适的#define。
int 作为位域是否被签名由实现定义。所以首先你应该使用signed 或unsigned 来指定这个。
但是,如果您总是只对 64 位感兴趣(编译器可能支持也可能不支持位域),那么您应该明确地使用“stdint.h”中的 uint64_t(或 int64_t)类型.那么,使用位域对我来说没有多大意义。
如果您没有,请在您的平台上为适当的 64 位类型执行 typedef,您以后可以轻松替换或放入 #ifdef 子句。
【讨论】: