Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.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
C++ 还有满满一点?_C++_C_Bit Manipulation - Fatal编程技术网

C++ 还有满满一点?

C++ 还有满满一点?,c++,c,bit-manipulation,C++,C,Bit Manipulation,我最近一直在阅读一些代码,遇到了一些行,例如: somevar &= 0xFFFFFFFF; 什么是安定点的东西,所有位都打开了;“somevar”可能是一个64位的变量,因此这段代码将提取底部的32位 编辑:如果它是一个32位变量,我可以想到其他原因,但它们更加模糊: 常量0xFFFFFFFF是自动生成的代码 有人试图欺骗编译器,使其无法优化某些内容 有人故意希望在调试期间无操作行能够在那里设置断点 我想这取决于某个变量的长度。当然,如果somevar是64位int,这将不是一个n

我最近一直在阅读一些代码,遇到了一些行,例如:

somevar &= 0xFFFFFFFF;
什么是安定点的东西,所有位都打开了;“somevar”可能是一个64位的变量,因此这段代码将提取底部的32位

编辑:如果它是一个32位变量,我可以想到其他原因,但它们更加模糊:

  • 常量0xFFFFFFFF是自动生成的代码
  • 有人试图欺骗编译器,使其无法优化某些内容
  • 有人故意希望在调试期间无操作行能够在那里设置断点

    • 我想这取决于某个变量的长度。当然,如果somevar是64位int,这将不是一个no-op。或者,somevar是一个重载的
      操作符&=

      的类型。事实上,如果
      somevar
      int
      类型(32位整数),这是没有意义的。但是,如果它的类型为
      long
      (64位整数),则这将屏蔽该值的上半部分(最高有效)


      请注意,
      long
      值不能保证为64位,但通常在32位计算机上。

      有时
      long
      的大小是32位,有时是64位,有时是其他大小。也许代码正试图对此进行补偿——或者只使用该值(如果是32位),或者屏蔽该值的其余部分,只使用其较低的32位。当然,这并不是真正意义上的,因为如果需要的话,在64位环境中使用int(< /p> < p>肯定是比较容易的)截断32位。

      如果代码片段是C++,那么可能会重写<代码>和= /> >操作符,以便产生与位和(或)不特别相关的效果。当然,那将是一件肮脏、邪恶、肮脏的事情

      它不会是一个nop(巴林编译器优化),虽然副作用是坏的,他们被一些人使用。不是所有的代码都有意义-可能有人键入了几个额外的“F”字符错误。我希望一个32位编译器会优化它。无符号长?古怪的我本来以为是64位的。一个无符号长字符不能是64位吗?可以。唯一的要求是它的位数大于等于unsigned,并且不能假定int为32位,long为64位。(也许你明白这一点,只是懒散的措辞让你的回答暗示这些是正确的?@R.Pate:是的,这是真的。我之所以这样说,是因为目前32位系统占主导地位,但事实就是如此,而且,因为代码很可能是为32位系统编写的。它是编译器/实现的属性,而不是运行程序的计算机的属性。有些编译器甚至允许您在允许的范围内更改数据类型的大小。@R.帕特:据我所知,编译器通常基于处理器体系结构。另外,请注意,Java/C#明确指出,“int”是32位整数,“long”是64位整数。我想在C/C++中,它比任何东西都更符合惯例。正确,在这些实现中,long的大小与int的大小相同。正如你所期望的,这会偶尔会导致C++程序员撕毁他们的衣服,并尖叫着:“为什么标准中没有64位整数?”在实践中,您总是可以编写使用stdint.h的“几乎可移植”代码,前提是如果stdint.h还不可用,那么为任何给定平台实现它都很简单。int也不一定是32位的。这只是机器的原生类型。它可能是8位、16位、32位、64位、80位或其他一些奇数大小。char、short、long等也是如此。