最近在CCS标准库中我看到过类似的东西
函数正在使用unsigned int参数。
delay(unsigned int)
这就像这样使用
delay(~(0));
现在如何解释(〜(0))?
如果我这样使用
printf("%d",(~(0)));
如何处理签名int? unsigned int?长整数?还是unsigned char?
它如何依赖系统? c规范说的是什么?
答案 0 :(得分:5)
回想一下,~
是按位NOT运算符,0
是一个整数,sizeof(int)
字节大小。
由于0
所有位都设置为零,(~0)
所有位都设置为1.
如果(与大多数系统一样),请sizeof(int)==4
,然后(~0) == 0xFFFFFFFF
。
基本上,这是delay
可能的最大值(假设为delay(unsigned int)
)
#include <stdio.h>
#include <limits.h>
int main(void)
{
printf("sizeof(0)=%d sizeof(~0)=%d\n", sizeof(0), sizeof(~0));
printf("0x%X\n", (~0));
printf("%d\n", (~0)==UINT_MAX);
return 0;
}
输出:
$ ./a.out
sizeof(0)=4 sizeof(~0)=4
0xFFFFFFFF
1
答案 1 :(得分:0)
默认情况下,所有整数常量都被视为signed int
。但是,当您使用printf
打印它时,参数将根据格式说明符进行类型化/提升。
在delay(~(0));
我假设delay()
总是期望unsigned int
参数因此~0 == 0xffffffff
(因为int
是4个字节,因此0xffffffff
)将被提升为unsigned int
。
答案 2 :(得分:0)
~0
是一个全1位的int(因为一元~
是按位非运算符)。在大多数计算机上,two's complement <{3}} x86计算机上-1
printf("%d\n", ~0);
所以{{1}}输出-1。