我正在学习位打包和位缓冲器,我遇到了这行代码

int NumBits = sizeof(float) << 3

现在输出是正确的,浮点数是4个字节,当您将其转换为位时,它是32位,这是NumBits的值

我的问题是,位向左移位3是如何得到正确的值的?

他们也可以用相反的方式,将实际的NumBits向右移动3

int numbytes = NumBits >> 3;

推荐答案

Sizeof(浮点数)返回浮点数的大小,单位为字节.在大多数系统(例如PC)中,浮点数是4个字节,因此sizeof(浮点数)等于4.

<;<;运算符是左移位运算符.当您将一个值左移一定位数时,您可以有效地将该值乘以2,并将其乘以移位位数的幂.在本例中,您左移了3位,因此相当于乘以2^3,即8.

因此,sizeof(Float)<;<;3等于4<;<;3,等于32.

总而言之,向左移位3与乘以8相同,后者给出了位数.同样,向右移位3与除以8相同.

C++相关问答推荐

字符串令牌化xpath表达式

为什么可以通过指向常量int的指针间接地改变整数的值?

为什么输出不是从上到下C

LONG_DOUBLE_T是否存在(标准C:C23)

使用AVX2的英特尔2022编译器的NaN问题&;/fp:FAST

在基本OpenGL纹理四边形中的一个三角形中进行渲染

是否需要包括<;errno.h>;才能使用perror?

链接到底是如何工作的,我在这里到底做错了什么

仅从限制指针参数声明推断非混叠

为什么编译器不能简单地将数据从EDI转移到EAX?

将数字的每一位数平方,并使用C将它们连接为一个数字(程序不能正确处理0)

在运行时判断C/C++指针是否指向只读内存(在Linux操作系统中)

如何组合两个宏来初始化C语言中的字符串数组?

当用C打印过多的';\n';时输出不正确

Tcl_GetDoubleFromObj在列表的迭代中是一个缺点

将char*铸造为空**

C 错误:对 int 数组使用 typedef 时出现不兼容的指针类型问题

是否可以在多字 C 类型中的任何位置混合存储和类型限定符?

仅使用其内存地址取消引用 C 中的 struct

如何确保 gcc + libc 对于多字节字符串使用 UTF-8,对于 wchar_t 使用 UTF-32?