“ i%0xff”的结果是什么?

时间:2018-09-04 13:51:02

标签: c

所以我在一些蓝牙代码中找到了它,我想知道它的作用。

for (int i = 0; i < sizeof(notify_data); ++i) {
    notify_data[i] = i%0xff;
}

结果为0x {00 01 02 03 04 ...},但是如何以及为什么?

3 个答案:

答案 0 :(得分:4)

此代码实际上可能是错误的。

作者可能是说i & 0xffi % 0x100,因为在此范围内i%0xff`没有太大意义。

他只想保存数据的最低8位。

模块%的操作返回整数除法的余数。

假设xy是整数

x % y = x - y * (x / y) 

编辑

for (int i = 0; i < sizeof(notify_data); ++i) {
    notify_data[i] = i%0xff;
}

此代码的质量很低。 问题:

  1. i必须是size_t而不是int

  2. sizeof(notify_data)是最常见的初学者错误之一,因为sizeof不能给出对象的运行时大小。它被评估为编译时间,正如我们在这里看到的,许多初学者认为它像strlen一样工作,或者返回malloc分配的内存块的大小

示例:

char x[100];
char y[200];

void printsizes(char x[])
{
     printf("sizeof(x) = %zu, sizeof(y) = %zu\n", sizeof(x), sizeof(y));
}


int main(void)
{
     printsizes(x);
}
  1. 使用错误的%

答案 1 :(得分:-1)

由于%是运算符,可返回整数除法的余数。 这意味着此代码是正确的! 并使数组数据等于i直到“最大8位最大值”,然后重复循环。 这只是为了不溢出8位值的保护措施!

谢谢你们;)

答案 2 :(得分:-2)

用0到0xff的值填充数组。如果数组大于0xff元素,则从0重新开始。 将会是诸如{0,1,...,254,0,1,.. 254,0,1,...}之类的东西。