从一段小小的C语言程序说起(2)

还是先贴出程序:


 

那么,这里有个问题是: printf 用%d格式输出不是打印整形的值么 那不就是要打印从s[2]开始的四个字节么?

 

或者是另有其它原因呢?

 

可能有人会说,应该写成:

这里不作为讨论的重点, 其实是将四个整数赋给字符数组的四个元素s[0]s[1]s[2]s[3],因为 char型,也是int型的一种,相当于__int8。8位的int, 所以当然可以这样赋值,只要所赋的值不超过char的范围就不会溢出,故这个问题就不说了。

 

回到正题:

 

其实这是一个类型转换的问题
printf("%d/n", s[2]);
跟printf("%d/n", (int)s[2]);
一样的效果,只是第一个由编译器自动转换了,第二个由你提醒编译器要进行强制转换

那么一个char型转换成int型,就是把一个字节的数据扩展成四个字节,高三个字节按照char型数据的符号位进行扩充,如果char的高位是0,那么高三个字节就扩充成0,如果是1就扩充成1。

来个实际的数据就明白了
char a = 1;
他的二进制表示就是0000 0001
转换成(int)a
扩充到int也就是32位0000 0000 0000 0000 0000 0000 0000 0001

注:如果这时没有将其赋给某个数的话,这个值是临时存在的,实际上的a并没有改变

char a=-1;
他的二进制表示就是1111 1111,
转换成(int)a
扩充到int也就是32位1111 1111 1111 1111 1111 1111 1111 1111

对于为啥不是打印接下来的四个字节的数据,是因为这个扩充不是从内存中去读取接下来四个字节的内存数据,而是把一个字节的数据扩展成四个字节

 

----------------------------------------------------------------------------------------------

 

后面准备多找点这样的程序,写写自己认为对的解释,当然我认为对的不一定就是对的,还希望高人指正!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值