c - 类次和类次分配给出不同的结果

标签 c bit-shift

我的目标是从这个 8 位整数(或者您经常调用它,unsigned char)左侧删除 byte-count+1 位.

应该很简单,但是就是这段代码

uint8_t val = 0xC3;
uint8_t byte_count = 2;
uint8_t cc = val << (byte_count+1) >> (byte_count+1);
printf("%X", cc);

结果是 C3

虽然这个

uint8_t val = 0xC3;
uint8_t byte_count = 2;
uint8_t cc = val;
cc <<= (byte_count+1);
cc >>= (byte_count+1);
printf("%X", cc);

只给我 3

是的,我试过在它周围加上一堆括号。
是的,我已尝试将表达式中的所有内容都转换为 uint8_t

为什么会这样?

最佳答案

促销。

在偶然发现几个关键字后,我找到了促销并用谷歌搜索了它。找到this answer .

较小的数据类型将在表达式中隐式提升为 int/unsigned。 This other answer详细解释。

因为我们的初始 uint8_t 操作数被提升为更高位数的整数,然后将其移位(在本例中)3 并返回将不再“删除”这些位。这是因为在第一个移位中它们将不再位于位边界之外。

移位赋值当然不会发生同样的情况,您不能转换左操作数,因为它是左值(意味着它代表内存,不可调整大小)。它还返回一个表示左操作数的左值,因此也无法提升。

printf("%d\n", sizeof(
    (uint8_t)2 + (uint8_t)3
));

//Output: 4

关于c - 类次和类次分配给出不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62802986/

相关文章:

c++ - 如何提高套接字上的安全连接

c - 为什么要包含头文件? #include 是如何工作的?

c - AT&T 程序集 : how to mult a double by 2 without local variable. Shift Double?

c - Unresolved external symbol 错误。 dumpbin 显示附加到符号的额外 @number

c - Azure IoT - 重置和清除设备孪生

c - 逆时针旋转字节数组

c++ - 使用位移位来缩短 2 个字符会导致值很大的奇怪结果

compiler-errors - 如何解决移位运算符语法错误?

c++ - 在 C++ 中附加两个无符号字符的位运算符

您可以使用 Arduino Uno(c 代码)同时多次运行一个函数吗?