关于C语言的文件型指针和移位操作中的一些有趣问题的探讨

1 篇文章 0 订阅
1 篇文章 0 订阅

首先,我最近在做一些关于C中的FILE*指针的一些练习,无意间发现了一个有趣现象,现将这个现象写出来,以供探讨:


这是我写的一个将bmp图像内部的2进制值转为ASCLL码的1和0保存在一个txt文件中的一段代码;

有趣的现象发生在这个函数上:

这个函数是stdio中为FILE型指针提供的一个2进制流提取的函数,第一个参数是将要提取的内容

保存的地址;第二个参数本身是指sizeof(type),即返回一个字节个数,如sizeof(int)则一般返回为4,即

4个byte即32位;第三个参数指需要提取的次数;最后的参数则是一个提取源的文件指针。

那么有趣的现象时什么呢?

本身该bmp用UltraEdit打开后观察,可以看到如下现象:


可见开头的32位2进制应该是01000010 01001101 01000110 11111111

我写了一段代码:(跟上面有区别)

函数的解释来讲,我们自然而然会觉得,首先使用fread函数读取4个字节存入dusbin这个无符号整形变量中;

那么dusbin中应该是这样存放数据的:01000010  01001101  01000110  11111111,顺序从头到尾;然后我用了移位操作,

首先向右移位31位,然后将结果存入临时变量temp,再与0x00000001按位与,即保留最低位的值,然后输出,本意是输出最高位,按理来说是0;以下依次类推,

移位数不断减少直至0,即从最高位0读到最低位1,输出到屏幕;.......................但是,程序运行结果如下:

乍看之下,好像最先输出的却是最低位,其实不然,它只是最先输出的是最低一个字节,但仍是从高到低来输出的;

这一点可以从后面的字节看出来,01000110对应的是从UltraEdit里看出的倒数第二个字节;可见,如果我写的代码没有错误,那么可以得出一个结论:

fread函数读取2进制流的顺序是一个字节一个字节读取的,并且,现在看来,将它保存给一个单一变量的时候,它保存的顺序是从最低字节开始保存,即读到的第一个字节存入该变量的最低字节,依次类推。

但是这个现象不符合一般总结的计算机数据存储规律,所以称之为“有趣的现象”,希望大家懂的能看出门道来,或许我的理解有误,本身并不是这样的,只是我想错了而已,又或许我的代码本身意思有问题而已。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值