C语言二级题

这个咋做啊

    在C语言中,整型常量有十进制整型常量、八进制整型常量和十六进制整型常量三种表示形式。(1)十进制整型常量。此种格式的整型常量只能出现 0~9 的数字,且可带正、负号。(2)八进制整型常量。此种格式的整型常量以数字0开头的八进制数字串。其中数字为 0~7。(3)十六进制整型常量。此种格式的整型常量以0x或0X(x是大写)开头的十六进制数字串。其中每个数字可以0~9、a~f或 A~F 中的数字或英文字母。

    提问的图片中的代码里,「char x = 040;」的意思是「定义并初始化字符型变量x,初始值为ASCII码值为八进制整数040的字符」。八进制整数040也就是十进制整数0×8^0+4×8^1=32,ASCII码值为32的字符为「空格」,不过最后一句格式化输出printf里,是按整型格式输出x的新值的,所以可以不用管到底ASCII码值对应的是什么字符。

    格式化输出printf那一行里,「x = x << 1;」的执行过程,包含2步,(1) 「x << 1」中的「<<」是左移运算符,这里首先要知道「数据在计算机中是以补码形式存储的」,而左移运算符就是直接对内存中的补码进行操作的,它的具体规则是「左移运算符:左边抛弃,右边补零。」。那么变量x的初始值是32,在内存中的补码,用8位二进制表示就是「0010 0000」,(实际上,中间没有空格,这里为了便于阅读,故意每4位二进制数添加了一个空格,请不要误解。)那么,按照左移运算符的规则向左移1位,得到的结果就是「0100 0000」,再转换为十进制就是整数「64」了。(2)现在再把十进制数64赋值给x,所以x的最新的值就是十进制数64了。

    输出整数64。

    虽然,通常可以把左移运算符看作是原数乘以2,但是,要注意数据类型在计算机中是有长度限制的,也就是说数据在计算机中是有取值范围的,如果一个数乘以2的结果超过了这个数本身的类型取值范围的话,那么结果就不再是乘以2的结果了。比如,十进制数1073741824(十进制) 的补码是 01000000000000000000000000000000(二进制,4个字节,32个二进制位),正数的补码和原码相同,左边第一位是符号位,0表示正,1表示负;所以,如果对1073741824做左移运算1位的话,得到的补码是二进制数10000000000000000000000000000000,转换回十进制数就是-2147483648,已经不是十进制数1073741824的2倍了。因为4个字节的整型数值的最大值是2147483647,所以并不是所有的整型做左移1位的运算都是原数乘以2。当然了,在十进制数1073741824以下的范围内,对整型数据做左移1位的运算,结果是原数乘以2。

如有帮助,烦请采纳,谢谢!

温馨提示:答案为网友推荐,仅供参考
第1个回答  2019-02-19
选择答案为64。
题目意思是左移一次,每左移一次,相当于原数乘以2。
第2个回答  2019-02-20
首先,需要知道040这个数因为是0开头,因此它是个八进制的数,换算一下:40o=[4][0]o=[100][000]B=100000B,40o=4*8+0*1=32D,十进制是32
其次x=x<<1这个表达式取值就是x移位后赋值成功的值,它将被printf当做整数输出到屏幕上
二进制左移1位的结果:x<<1=100000B<<1=1000000B
结果转换成十进制:1000000B=[001][000][000]B=[1][0][0]o=1*64+0*8+0*1=64D
因此输出为64追问

你这个换算是怎么做的啊

追答

八进制转十进制:写出八进制每位基数,个位1,高位=低位*8

8 1 比如你要转换的是40,则写出两位基数并将40按位对齐写在下面一行 
4 0 这个数中包含4个8和0个1,加起来就是十进制了

二进制也这么转换,基数不同,n进制基数:个位1,高位=低位*n

本回答被提问者和网友采纳
第3个回答  2019-02-21
在C语言中,整型常量有十进制整型常量、八进制整型常量和十六进制整型常量三种表示形式。(1)十进制整型常量。此种格式的整型常量只能出现 0~9 的数字,且可带正、负号。(2)八进制整型常量。此种格式的整型常量以数字0开头的八进制数字串。其中数字为 0~7。(3)十六进制整型常量。此种格式的整型常量以0x或0X(x是大写)开头的十六进制数字串。其中每个数字可以0~9、a~f或 A~F 中的数字或英文字母。
第4个回答  2019-02-20
0X40的二进制表示为:01000000,<<1表示左移一位,即左移一位后是10000000,用十进制表示就是128,课件待选答案中没有128,也就还说本题是题目给错了。
相似回答