C ++中8位整数和32位整数之间的按位AND

时间:2011-12-08 01:41:31

标签: c++ c gcc int bit-manipulation

如果我在8位整数(int8_t)和32位整数(int)之间执行按位AND,结果是8位整数还是32位整数?

我正在使用GNU / Linux和GCC编译器

为了稍微改变一个问题,在执行按位AND之前,是否丢弃了32位整数的前24位,或者是8位整数首先将类型转换为32位整数?

编辑: 在这个小代码中

#include <iostream>
#include <stdint.h>
int main()
{
  int    i=34;
  int8_t j=2;

  std::cout<<sizeof((i&j))<<std::endl;//Bitwise and between a 32 bit integer and 8 bit integer
  return 0;
}

我得到输出为4.我认为这意味着结果是32位整数。但我不知道结果是否取决于机器,编译器或操作系统。

4 个答案:

答案 0 :(得分:6)

对于&运算符(以及大多数其他运算符),在评估运算之前,任何小于int的操作数都将被提升为int

从C99标准(6.5.10 - 描述按位AND运算符):

  

通常的算术转换是在操作数上执行的。

(6.3.1.8 - 描述通常的算术转换):

  

在两个操作数上执行整数提升

(6.3.1.1 - 描述整数促销):

  

如果int可以表示原始类型的所有值,则该值将转换为int;否则,它将转换为unsigned int。这些被称为整数   促销。

答案 1 :(得分:2)

无论语言指定什么,问题的答案是,如果高位24位在按位之前被丢弃并且被执行则无关紧要,因为它们在一个操作数中是全零位,因此在结果。

答案 2 :(得分:1)

8位整数被类型转换为32位整数。按位运算符触发通常的算术转换(这意味着较小的类型被提升以匹配较大的类型)。这是在规范的第5.1章中定义的。

答案 3 :(得分:0)

在对int执行任何操作之前,将小于int的整数类型提升为{{1}}。您可能想看看CERT Secure Coding Standard关于“理解整数转换规则”的内容。