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

来源:互联网 发布:mysql查看表 编辑:程序博客网 时间:2024/05/19 04:04

还是先贴出程序:


 

那么,这里有个问题是: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

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

 

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

 

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

原创粉丝点击