c - fscanf 仅获取十六进制数的前 4 个字节
问题描述
我正在用 C 语言编写一个缓存模拟器,并且已经完成了所有工作......除非我尝试扫描地址 fscanf 正在跳过十六进制数中的一些数字:它只会得到 4 个字节!如果我无法获得正确的地址,则标签位不正确,并且模拟不会总是有效。这项任务似乎很简单,但我一定遗漏了一些东西。也许与 fscanf 格式字符串特性有关?
源文件如下所示:
S 00600aa0,1
I 004005b6,5
S 7ff000398,8
M 7ff000390,8
// and so on ...
我尝试使用 fgets 和 sscanf 代替,但得到了相同的结果。
char buffer[200];
char *pattern = " %c %x,%s\n";
int status; long address; char op;
while ((status = fscanf(source, pattern, &op, &address, buffer)) != EOF) {
if (op != 'I') {
fprintf(stderr,"address: %x\n",address); // DEBUG stmnt
simulate the cache..........................
调试语句为第 3 行打印出错误的地址。而不是“地址:7ff000398”,它写入“地址:ff000398”。第 1 行它是正确的。为什么它只读取前 4 个字节?'address' 已经很长了,我找不到任何关于 %x 行为的文档。
解决方案
变量的address
类型是long
只能存储 4 个字节,0x7ff000398
是 8 个字节。所以它只存储最后 4 个有效字节并忽略最重要的字节。这就是第 1 行和第 2 行按预期工作但第 3 行没有工作的原因。
要修复它,您可以将地址类型更改为long long
推荐阅读
- vue.js - 探索性 Vue.js 示例所需的存储空间
- javascript - 更新卡片类别时按钮不起作用
- c# - Prism导航返回页面后打破页面绑定
- c - 我用什么代码来询问数量和付款?
- apache-spark - Spark - 读取和写入相同的 S3 位置
- mysql - 如何在 MySQL 中回滚到 django 默认创建的事务?
- java - 将超类方法返回的超类实例转换为子类实例
- php - 数据库播种 laravel 创建 50 个用户并为每个用户附加一个关系
- vhdl - Shift left register with load and enable signals
- apl - APL 中的重复函数应用