2010-12-10 28 views
0

如果我定义一个结构x1然后分配一个无符号的int xyz:64,它会创建一个64位的整数吗?我需要分配一个64位值的变量

现在,如果我想在64位的所有一个人的,将按以下工作:

x1.xyz = 1 

将这个值填入64人的变量?如果有任何其他方式来定义一个变量并赋值给它,建议我。

请帮忙

在此先感谢。

+0

你应该使用'unsigned long long xyz:64' – MSalters 2010-12-10 13:16:24

回答

4

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

+2

-1只有111 ... 1111如果你的机器使用二进制补码 – rve 2010-12-10 10:27:59

+0

@rve:虽然这是真的,但我怀疑这里有很多人需要编程一个没有。 – 2010-12-10 10:31:01

+0

@rve:由于'.xyz'是无符号的,因此机器是否使用两个补码数字作为有符号数字无关紧要。给一个无符号整数赋“1”给出了'UINT_MAX'。见http://stackoverflow.com/questions/809227/is-it-safe-to-use-1-to-set-all-bits-to-true – MSalters 2010-12-10 13:15:30

0

都能跟得上

这将分配一个变量,以二进制这将是:

0000000000000000000000000000000000000000000000000000000000000001 

来分配所有的人,你将不得不使用的最大值为无符号的类型(其应该在C++)

无符号__int64我认为,最大值为

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

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

+1

而且每个人都会立即明白,长长的数字不是一个神奇的数字,但实际上将所有的位设置为1.使用'(uint64_t)-1'或'0xFFFFFFFFFFFFFFFFU'更具可读性。在某个头文件或其他文件中可能有一个合适的#define。 – AlastairG 2010-12-10 10:16:31

+0

任何人问这个将知道什么是十六进制数字,而一个十六进制的F表示15或11111111在二进制... – willvv 2010-12-10 10:20:03

+1

我希望如此,如果不是他们可以问。当然,知道0xFFFFFFFFFFFFFFFF的程度人口比例明显高于知道18,446,744,072,709,551,615意义的程序人口比例。此外,十进制版本错误地输入要容易得多,并且很难发现它被错误地输入。 – AlastairG 2010-12-10 11:10:53

1

尝试将-1分配给无符号整数将导致编译器警告充其量。您必须将-1转换为您要分配的类型。

另一种方法是明确指定值为0xFFFFFFFFFFFFFFFFU。

0

它是实现定义是否int作为一个位域被签名或不。所以首先你应该使用signedunsigned来指定这个。但是,如果你总是对64位(你的编译器可能支持或不支持位字段)感兴趣,你应该明确地使用“stdint.h”中的uint64_t(或int64_t)类型。那么使用位域对我来说毫无意义。

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

+0

我一直对64位不感兴趣。那我该怎么做? – user537670 2010-12-11 02:56:30

2

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

3

与非操作(〜),否则它可能是一个打字量最少的:

unsigned int x = ~0 ; 

但是我不能完全肯定,如果有一种方法,以确保此填写64位,而不做某种类型转换的,就像这样:

__int64 y = ~ (__int64)0 ; 
+0

按你所建议的按位否定不是获得全1矢量的正确策略。 '0'的类型是'signed int',所以''0'也是。取决于符号表示“〜0”可以是所谓的陷阱表示。正确的初始化是用'-1'。这总是保证给你任何无符号类型的最大值。无符号类型的算术是这样做的。 – 2010-12-11 07:53:53

+0

这似乎与没有两个人的补充一样。你总是可以输入〜0U(用U扩展名)来确定是正确的?另一种方法也是使用数值限制,这应该是100%安全的方式。根据'unsigned int'和'unsigned long long'的大小, – 2010-12-11 10:46:24

+0

〜0U可能会产生一个值0000 .... 1111(32个零,32个)。你需要'0ULL'。 – MSalters 2010-12-14 09:25:15

1

你应该使用标准式的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; 
+0

如果我并不总是对64位感兴趣,那么假设我的结构有一个只有17位的元素,我需要将所有17位分配为1?感谢您的答复。 – user537670 2010-12-11 02:56:59

+0

@ user537670:对于大多数编译器,这两个想法中的任何一个都仍然有效。前15位将被简单地丢弃。 – JeremyP 2010-12-11 16:56:39