请教关于c语言中年数输入的问题,详细见下图。

这个
里面输入的是10进制数,譬如输入74,那么除法运算里面是按10进制数取出了7吗,是因为后面除以10是10进制吗,后面的右移4位中这里是变成了16进制吗,是不是10进制进去计算机会自动转换为16进制,但是在运算时如果对应的是10进制,则会自动以10进制的形式参与运算。希望各位高手帮一下忙,急,在线等。

移位运算符是按2进制算的,操作数是十进制的,也会按照二进制进行运算。正常的加减法运算是按10进制的。追问

那74是0x4A除以10难道按照2进制计算吗,那结果是什么啊。操作数是10进制的也会按照二级制计算?但是这个应该是把7和4分别取出来,按照你说的,取出来是什么啊?

追答

取出来的就是7和4,你不用管那些计算机的原理,只管语言对数字的处理就可以了:正常的数字都是十进制的(没有前缀的数字);在移位运算的时候就会按二进制算。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-10-11

数字在计算机里是二进制存在的,并不是因为参与什么运算就变成了某某进制。

你输入74,只不过是为了人阅读方便是十进制,但是在计算机中还是二进制存在的。这是发明计算机时就规定好的,二进制便于电路实现,(电路有开关两种状态)

另外你说的那个是左移4位吧 

    uc_Year10y = uc_DS***/10 ---->目的是将数字的各位去掉,比如输入174,那么变成17了

    uc_Year1y= uc_DS***%10------>目的是取出数字的各位部分,比如输入174,结果为4

    uc_DS1339Yearval = (uc_Year10y << 4)|uc_Year1y------>这句话的意思很明白了

    因为uc_DS1339Yearval是个char型,一共8位,左移以后,高四位用来存uc_Year10y,低四位用来存储uc_Year1y

    最后那句话貌似要将uc_DS1339Yearval存储到某个位置(猜测)

追问

老大,这个程序我读懂了,我看大家的回答,输入74存到电脑里面不应该是0100 1010,怎么变成0111 0100啊?按照四楼的说法的话。关键是我现在是程序理解是什么意思,但是前后的进制算法弄糊涂了。我刚开始是这样理解的,74,取高位除以10,计算余数取低位,但是我现在是按照10进制取数,后面移位是16进制,我现在比较疑问的是:计算机存储肯定是按照2进制,但是第一个计算我是按照10进制取数的啊,所以我现在的疑问是这个?

追答

十进制,16进制只不过是人脑中的概念而已,计算机只知道二进制。

比如uc_Year10y在计算机中就是二进制存储的,你要对它进行除法运算,实际上编译器将这个操作转化成底层运算器的操作,而底层预算器不知道十进制,只知道二进制(高低电平),编译器将这种人理解的除法预算,转化成什么二进制操作,返回的二进制结果进过编译器解析,可以成为人可读的十进制。

追问

按照你的说法,174存储到里面之后应该是2进制,但是计算的时候为什么又以10进制在计算呢,174/10=17......4,这不是前后矛盾吗?我的意思是:计算机存储肯定都是以2进制啊,但是做除以10运算的时候,因为所给的10是10进制数,所以这时候程序实际上是按10进制计算的,这样才是174/10啊,要不然难道是174的2进制(0x1E)和10(0xA)相除吗?我理解程序的意思,现在是我想多了,困在这了,理论俺都了,不知道各位大哥懂我的意思。

追答

计算机做的是174的2进制(0x1E)和10(0xA)相除
看看计算机组成原理,或许对你的问题有所帮助

本回答被网友采纳
第2个回答  2012-10-11
1.当出现在表达式里时,有符号的和无符号的char和short类型都被自动转换为int,在需要的情况下,将自动被转换为unsigned int
2.当作为函数的参数被传递时,char 和short会被转换为int

读取输入之后在内存中都是以二进制存放的。不同的类型占据的内存大小和存储方式不一样。各种运算在计算机内部也是以二进制运算的。输出的时候可以按不同类型输出。

我好像明白了你的意思,这应该牵扯到计算机组成的知识还有c语言的类型转换的知识。不过计算机组成我还在学,所以你的问题我暂时回答不了,,,
第3个回答  2012-10-11
应该这么说,计算机它只认识010101的代码。这里当然转换了0和1存放于内存。

按你说的输入74:

unsigned char占1个字节, 8位来表示uc_Year10y 即: 0000 0111
它在内存中存储排列就是这样的。具体要看你怎么去解释它们意义了。
uc_Year10y << 4 左移4位: 0111 0000 即112
uc_Year1y = 4 即: 0000 0100
将二者做或运算: 0111 0100 , 即 116
因为不清楚你的函数实现的功能,同时引用的那个变量或是宏定义DS1339REG_Year的意义也不清楚,不好做其他的推断。

赞同wanglixin1001的说法:
高4位代表10年个数,低4位代表1年的个数~
这样在进行位运算后,解释出来值为74,与输入中的年份相吻合,应该为正确逻辑。
第4个回答  2012-10-11
输入74,那么运算后的uc_Year10y = 7(二进制位00000111),uc_Year1y=4(00000100)。然后将uc_Year10y 左移四位,再与uc_Year1y进行位或操作,得到的uc_DS1339Yearval为01110100。这个就是表示高四位存放7(10位),低四位存放4(个位)。
意思就是用一个unsigned char(8)为的高四位代表多少个10年,低四位代表多少个1年。
第5个回答  2012-10-11
输入 74 74%10这样就取出4了
74/10 这样就取出7了

至于右移4位 没有变成16进制 变进制不是用移位的

你说的比较乱 我就看出这些了追问

这个我知道,关键是最后不是左移四位,这时候肯定是安16进制来说的啊,要不然10进制怎么左移4位啊,我的意思是前面是10进制,譬如说74,但是74会以2进制保存,这时候除以10取7的时候计算是不是默认10进制,其实存到计算机里面的是2进制,所以才有后面的可以移位

追答

10机制照样左移啊

你那个左移4 相当于乘以16
例 a=1; a=a<<4; 这时候a=16了

估计你是想的太多了

第6个回答  2012-10-11
说的好乱啊。。。。不太明白追问

就是里面每一句指令里面参与的数据的进制数,帮忙描述一下,譬如说74年 ,帮忙把74分析一下在每句之后的结果和分析过程

相似回答
大家正在搜