C “的结果是什么?”;i%0xff“吗;?
所以我在一些蓝牙代码中发现了这个,我想知道它的作用C “的结果是什么?”;i%0xff“吗;?,c,C,所以我在一些蓝牙代码中发现了这个,我想知道它的作用 for (int i = 0; i < sizeof(notify_data); ++i) { notify_data[i] = i%0xff; } for(int i=0;i8位。@Bathsheba:}手机拼写检查啊,太好了!你回答了我的问题!我没意识到是操作员+1给你!(但有人投了反对票,所以我不能+1)@Kovalkova先生,我刚刚投了你的赞成票;你是>=15快上车@你想编辑你的答案让我接受吗?因为这没有错!“它只保留
for (int i = 0; i < sizeof(notify_data); ++i) {
notify_data[i] = i%0xff;
}
for(int i=0;i
结果是0x{00 01 02 03 04…},但如何以及为什么?此代码实际上可能是错误的 可能作者的意思是
i&0xff
或i%0x100
,因为i%0xff`在这个范围内没有太多意义
他只想保存最低的8位数据
模块%
操作返回整数除法的余数
假设x
和y
是整数
x % y = x - y * (x / y)
编辑
%
使用用0到0xff的值填充数组。如果数组大于0xff元素,则从0重新开始。
将类似于:{0,1,…,254,0,1,…,254,0,1,…}等等。因为%是从整数除法返回余数的运算符。 这意味着这个代码是正确的! 并使数组数据等于i,直到“8位最大值”,然后重复该循环。 这只是为了不溢出8位值的保护
谢谢大家;)
i%0xFF
将生成从0
到254
的值0xFF
是255
的十六进制%
是模数运算符。请小心,因为从internet获取的代码质量通常很低。不要从互联网示例中学习该语言。它可能只是一个bug,应该是i%0x100
。虽然如果你不知道%
在C语言中的作用,现在是读一本书的时候了。我想知道这是否就是为什么我的iPhone4不能在我妻子的保时捷中工作的原因?@mrkovalkova:在%.2f上下文中,%不是作为操作员,而是在一个带引号的字符串中。这只不过是printf类型函数使用的一种约定。8字节->8位。@Bathsheba:}手机拼写检查啊,太好了!你回答了我的问题!我没意识到是操作员+1给你!(但有人投了反对票,所以我不能+1)@Kovalkova先生,我刚刚投了你的赞成票;你是>=15快上车@你想编辑你的答案让我接受吗?因为这没有错!“它只保留i的最后一个字节。”如果它变为255而不是254(正如另一个答案已经指出的那样,这可能是它的意图,但不是代码实际所做的)。按原样,它将把255(最后一个字节是255)变成0,256(最后一个字节是0)变成1,等等。关闭1“i最多255”应该是“i最多254”。此外,这并不是“为了不溢出16位值而进行的保护”。它可能是一个“为了不溢出8位值而进行的保护”,但它在这方面的工作有问题。i%0xff
(int%int
)的结果是-254到254,具体取决于i
。从不255。不溢出16位值的保护应正确写入value&0xFFFF
。其他一切都是模糊的。“0xff(254)”不清楚。0xff是255。0xfe是254。@sepp2k注意:某些内部%0x100
范围是[-255…255]
。负值不可能是int i=0的问题;i
。
for (int i = 0; i < sizeof(notify_data); ++i) {
notify_data[i] = i%0xff;
}
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);
}