将uint8_t与数字进行比较
Comparing uint8_t with a number
也许我理解C++不正确,或者这是编译器的错误?
uint8_t a = 0x00;
uint8_t b = 0xFF;
if( a - b == 1 )
{
doNothing();
}
没有调用 doNothing(如预期的那样),因为 (a-b) 的结果在比较操作中隐式转换为第二个操作数的类型。对于数字,它被签名为int
。 好的。if( a - b == (uint8_t)1 )
{
doNothing();
}
什么都不做仍然没有被叫,但现在我不明白它的原因!我已经明确地将数字转换为uint8!
if( (uint8_t)(a - b) == 1 )
{
doNothing();
}
现在终于叫什么都不做了,但又是为什么?两个 uint8 的减法如何返回一个 int?
编译器是用于ARM Cortex M3的uVision ARMCC。
在a - b
中,操作数在减法之前被提升为int
,所以结果是-255,而不是1。
这就是为什么第一个和第二个例子都失败了;这与==
的另一个操作数无关。第三个将 -255 转换回 uint8_t
,将其减少到模 256,因此结果如预期的那样是 1。
好吧,
在数学和十六进制方面,我不是最好的,但似乎a = 0
和b = 255
所以它等于-255而不是1。
ARM Cortex M3 是一个 32 位处理器。所以 a - b 的结果是 0xFFFFFF01 它不等于 1(1 ==> 0x00000001 在 32 位表示中),所以不调用 doNothing() 函数!
在情况 2 中,如果您将 1 键入到 uint8_t,则0xFFFFFF01不等于0x01因此不再调用 doNothing() 函数!
在情况 3 中,当您将 a - b 输出键入到 uint8_t 时,a - b 结果是 0x01 等于 1,因此调用 doNothing。
相关文章:
- 比较并显示使用最小值(a,b)和最大值(a、b)升序排列的4个数字
- C++通过数字比较两个数字
- 如果相同的数字重复,如何比较流中的数字
- 使用三个数字比较器进行排序
- 如何实现通用比较?(用于数字和字符串)
- 数字之间的比较
- 如果堆栈在数字较低的地址增长,为什么指针比较会逆转这种情况?
- 如何将字符与数字进行比较?C++
- sort() 方法 c++ 中的比较器函数.为大量数字获得不同的解决方案
- 比较推送数据(100 万个数字)在 std::vector 中预先调整大小和没有
- 将数字与数字数组进行比较
- 在没有比较运算符的情况下查找 2 个数字之间的最小值
- 计数交换/比较合并排序算法的数字
- 比较二维数组中的数字时的无限循环
- C++ 比较 2 个不同列表中的值以使用 2 for 循环摆脱重复的数字。无法正确检测重复项
- c++ 输入一个数字来确定其他数字,然后比较它们
- 将映射的每个键中的数字数据与另一个数值进行比较
- 比较两个排序的数字向量(性能优先)
- 双重比较-数字限制
- 比较数字并查找具有相同数字的数字