所以我在一些蓝牙代码中找到了它,我想知道它的作用。
for (int i = 0; i < sizeof(notify_data); ++i) {
notify_data[i] = i%0xff;
}
结果为0x {00 01 02 03 04 ...},但是如何以及为什么?
答案 0 :(得分:4)
此代码实际上可能是错误的。
作者可能是说i & 0xff
或i % 0x100
,因为在此范围内i%0xff`没有太大意义。
他只想保存数据的最低8位。
模块%
的操作返回整数除法的余数。
假设x
和y
是整数
x % y = x - y * (x / y)
for (int i = 0; i < sizeof(notify_data); ++i) {
notify_data[i] = i%0xff;
}
此代码的质量很低。 问题:
i
必须是size_t
而不是int
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)
由于%是运算符,可返回整数除法的余数。 这意味着此代码是正确的! 并使数组数据等于i直到“最大8位最大值”,然后重复循环。 这只是为了不溢出8位值的保护措施!
谢谢你们;)
答案 2 :(得分:-2)
用0到0xff的值填充数组。如果数组大于0xff元素,则从0重新开始。 将会是诸如{0,1,...,254,0,1,.. 254,0,1,...}之类的东西。