如果我在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位整数。但我不知道结果是否取决于机器,编译器或操作系统。
答案 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关于“理解整数转换规则”的内容。