关于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;
}
以上是代码。 展开
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;
}
以上是代码。 展开
2个回答
2016-09-02
展开全部
2的二进制是00000010,取反得到11111101,最高位为1,说明这是个负数的补码。负数的补码,是由其绝对值的原码取反加1得到,反过来,将负数的补码减1取反,就得到其绝对值的原码。11111101-1=11111100,再取反得到00000011,即十进制的3。也就是说该负数的绝对值为3,那么这个负数为-3。
所以第一个值是-3
整型的每一种都分有无符号(unsigned)和有符号(signed)两种类型(float和double总是带符号的),在默认情况下声明的整型变量都是有符号的类型(char有点特别),如果需声明无符号类型的话就需要在类型前加上unsigned。
你声明变量无符号,将二进制转换无符号在转换十进制,导致最高位由原来的符号位变成了有效数字位了,参与转换
所以最后结果是253
你去掉前面的unsigned 两个值应该是一样的
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询