关于C语言位运算,赋值的问题,回答详细一点。为什么按位取反后输出的结果不一样?

#include<stdio.h>intmain(intargc,char*argv[]){unsignedcharval=2;unsignedcharnewval;fp... #include <stdio.h>
int main(int argc, char *argv[])
{
unsigned char val = 2;
unsigned char newval;

fprintf(stdout, "val=%d.\n", val);
fprintf(stdout, "~val=%d.\n", ~val);
newval = ~val;
fprintf(stdout, "newval=%d.\n", newval);
val = ~val;
fprintf(stdout, "val=%d.\n", val);
return 0;
}
以上是代码。
展开
 我来答
匿名用户
2016-09-02
展开全部
  1. 2的二进制是00000010,取反得到11111101,最高位为1,说明这是个负数的补码。负数的补码,是由其绝对值的原码取反加1得到,反过来,将负数的补码减1取反,就得到其绝对值的原码。11111101-1=11111100,再取反得到00000011,即十进制的3。也就是说该负数的绝对值为3,那么这个负数为-3。

  2. 所以第一个值是-3

  3. 整型的每一种都分有无符号(unsigned)和有符号(signed)两种类型(float和double总是带符号的),在默认情况下声明的整型变量都是有符号的类型(char有点特别),如果需声明无符号类型的话就需要在类型前加上unsigned。

  4. 你声明变量无符号,将二进制转换无符号在转换十进制,导致最高位由原来的符号位变成了有效数字位了,参与转换

  5. 所以最后结果是253

  6. 你去掉前面的unsigned 两个值应该是一样的

        

cayido001
2016-09-02 · TA获得超过172个赞
知道小有建树答主
回答量:210
采纳率:100%
帮助的人:225万
展开全部
~val 可以理解成一个右值,%d 表示~val默认为int型 自然就是-3了
newval = ~val; 等于是强制转换了类型, newval是无符号char 自然就是0xff-2= 253

%hhd 表示是一个可以把int型当成unsigned char输出 自然也是253
本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式