C语言~运算符及~0的编译器求值疑问(K&R习题相关)
关于C语言中~运算符及相关输出差异的解释
运算符~的作用
~是C语言里的按位取反运算符,作用是把操作数的每一位二进制数翻转:0变1,1变0。它直接对内存中的二进制位操作,不是简单的数值取反(比如把5变成-5这种逻辑)。
为什么printf("%u", (unsigned char)~0);输出255
- 系统里默认
0是int类型(一般为4字节32位),二进制全为0。 - 执行
~0后,32位二进制全变成1,对应数值为4294967295,但这里做了(unsigned char)强制转换。unsigned char是8位无符号类型,只会保留低8位的全1,高位直接舍弃。 - 8位全1的无符号数换算成十进制就是255,用
%u(无符号整数格式符)输出自然就是这个结果。
为什么printf("%u\n", ~0);输出4294967295
- 同样,
0作为int类型,~0得到32位全1的二进制数。这个数作为int类型是负数(补码表示下为-1),但%u是无符号整数的输出格式,会把这32位二进制数直接当作无符号数解析,32位全1对应的无符号十进制就是4294967295,因此输出该结果。
内容的提问来源于stack exchange,提问作者Lax
相关产品推荐
相关产品推荐

