Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
访问64位整数的下半部分 如何使用C或C++访问64位整数的下半部?我可以在汇编中轻松地完成它,但我不知道如何在C/C中完成它++_C_64 Bit_Integer - Fatal编程技术网

访问64位整数的下半部分 如何使用C或C++访问64位整数的下半部?我可以在汇编中轻松地完成它,但我不知道如何在C/C中完成它++

访问64位整数的下半部分 如何使用C或C++访问64位整数的下半部?我可以在汇编中轻松地完成它,但我不知道如何在C/C中完成它++,c,64-bit,integer,C,64 Bit,Integer,编辑:访问上半部分怎么样 long long BigOne = 0x1234567890ABCDEFLL; long long LowerHalf = BigOne & 0xFFFFFFFFLL; long long UpperHalf = (BigOne >> 32) & 0xFFFFFFFFLL; 抱歉,如果十六进制文字需要一些前缀/后缀,我对C不是很熟悉。如果您知道,请修复答案 很抱歉,如果十六进制文字需要一些前缀/后缀,我对C不是很熟悉。如果您知道,请修复答

编辑:访问上半部分怎么样

long long BigOne = 0x1234567890ABCDEFLL;
long long LowerHalf = BigOne & 0xFFFFFFFFLL;
long long UpperHalf = (BigOne >> 32) & 0xFFFFFFFFLL;
抱歉,如果十六进制文字需要一些前缀/后缀,我对C不是很熟悉。如果您知道,请修复答案


很抱歉,如果十六进制文字需要一些前缀/后缀,我对C不是很熟悉。如果您知道,请修复答案。

我以前使用过各种技巧来实现这一点。使用活接头、长班次等

现在我只使用memcopy。听起来可能效率不高,但上次我检查编译器时,代码优化得非常好:

int32_t higher32 (unsigned long long arg)
{
  unsigned char * data = (unsigned char *) arg;
  int32_t result;
  memcpy (&result, data+4, sizeof (int32_t));
  return result;
}

int32_t lower32 (unsigned long long arg)
{
  unsigned char * data = (unsigned char *) arg;
  int32_t result;
  memcpy (&result, data+0, sizeof (int32_t));
  return result;
}

我以前用过各种各样的技巧。使用活接头、长班次等

现在我只使用memcopy。听起来可能效率不高,但上次我检查编译器时,代码优化得非常好:

int32_t higher32 (unsigned long long arg)
{
  unsigned char * data = (unsigned char *) arg;
  int32_t result;
  memcpy (&result, data+4, sizeof (int32_t));
  return result;
}

int32_t lower32 (unsigned long long arg)
{
  unsigned char * data = (unsigned char *) arg;
  int32_t result;
  memcpy (&result, data+0, sizeof (int32_t));
  return result;
}

&
在获取
上半部分时没有意义。注意,右移是否执行符号扩展是实现定义的,因此不可移植。在可能的情况下,通常最好避免移动有符号值(实际上很少需要移动有符号值)。关于后缀问题:不需要后缀;如果十六进制文字不能由相同大小的有符号类型表示(如果使用十进制文字,“无符号”需要
u
后缀),则十六进制文字将由无符号类型表示。哦,这就是所谓的“符号扩展”?我不知道那是什么。:)我只知道有时右移时它会复制第一位,所以这就解决了这个问题。
&
在获取
上半部分时没有意义,是吗?请注意,右移是否执行符号扩展是由实现定义的,因此不可移植。在可能的情况下,通常最好避免移动有符号值(实际上很少需要移动有符号值)。关于后缀问题:不需要后缀;如果十六进制文字不能由相同大小的有符号类型表示(如果使用十进制文字,“无符号”需要
u
后缀),则十六进制文字将由无符号类型表示。哦,这就是所谓的“符号扩展”?我不知道那是什么。:)我只知道有时右移时它会复制第一位,所以这就解决了这个问题。注意,在小端和大端机器上,代码会有所不同。-1对于丑陋的端依赖代码,当有一种简单、快速的方法来做正确的算术操作时。它可能是端依赖的,但它不会生成对shift-int64运行时库子例程的丑陋而缓慢的调用。这就是大多数32位编译器在这种情况下会做的事情(不幸的是,错过了优化)。请注意,小端和大端机器上的代码会有所不同。-1对于丑陋的端依赖代码,当有一种简单、快速的方法来做算术正确的事情时。它可能是端依赖的,但它不会生成对shift-int64运行时库子例程的丑陋而缓慢的调用。这就是大多数32位编译器在这种情况下所做的(不幸错过了优化)。