我是一名C语言初学者,但是我对在C答案书中发现的以下示例感到困惑。
在您的系统上查找unsigned long long大小的一种方法是键入:
printf("%llu", (unsigned long long) ~0);
我不知道为什么这个语法能够工作?
在我的系统上,int
是32位的,而long long
是64位的。
我本来以为,由于0
是整数类型的常量,~0
会计算32位整数的否定值,然后由强制类型转换运算符转换为unsigned long long
。这应该会得到232-1的结果。
不知何故,看起来~
运算符已经知道它应该作用于64位?
编译器是否将这条指令解释为printf("%llu", ~(unsigned long long)0);
?但这听起来不对,因为强制类型转换和~
的优先级相同。
~0
的值取决于实现中的有符号表示。在除二进制补码以外的表示中,~0
与-1
不同。 - ouah(unsigned long long)~0u
的预期行为会发生,对吗? - Quentin