今天写代码遇到一个类似这样的问题,0xfd!=0xfd 我脑袋懵了,这两个值不是相等的吗?
让我们来看看怎么个事
uint8_t binHeader[10] = { 0x01,0xfd };
uint8_t ch = 0x02;
if (binHeader[1] ==(~ch))
{
printf("相等");
}
else
{
printf("不相等");
}
看似很正常的判断,对于0x02进行取反操作得到的值为0xfd,但是输出的结果为不相等!!!
因为~ch 取反操作的这个运算,由于ch是uint8_t类型,也就是unsigned char类型,运算结果后的类型会受到 C 语言的 整数提升规则(integer promotion)的影响。
什么是整数提升规则呢?
- 整数提升规则:在 C 语言中,uint8_t 是一个小于 int 的类型,当对它进行运算时,首先会将其提升为 int 类型。这个提升是因为 C 语言的标准要求,算术运算总是以 int 或更大类型来执行,即使操作数是较小的类型(如 uint8_t)。
也就是
- m_version 是 uint8_t 类型,它会首先被提升为 int 类型(通常是 32 位),然后 ~ 运算符会在这个提升后的 int 类型上执行。
- 结果是一个 int 类型的值,而不是 uint8_t 类型。
0x02 在8位二进制中为 00000010
取反之后为0x11111101,由于整数提升规则,实际为
11111111 11111111 11111111 11111101 这个值为-3;
所以判断0xfd != - 3 结果为不相等
为什么是-3呢?
这实际上是 -3 的二进制补码表示。我们来验证一下:
在计算机中,负数是以 补码 的形式表示的。为了表示 -3,我们先从 3 的二进制开始,然后取反并加 1:
- 6 的二进制表示是:00000000 00000000 00000000 00000011
- 取反:11111111 11111111 11111111 11111100
- 加 1:11111111 11111111 11111111 11111101
这就是 -3 的补码表示。
所以我们要加个强转类型,防止他变为int类型,让他运算之后还是uint8_t类型 这么写,输出的值为相等
uint8_t binHeader[10] = { 0x01,0xfd };
uint8_t ch = 0x02;
if (binHeader[1] ==(uint8_t)(~ch))
{
printf("相等");
}
else
{
printf("不相等");
}
标签:11111111,ch,int,uint8,整数,提升,规则,类型,0xfd
From: https://blog.csdn.net/qq_49420679/article/details/144783337