32位有符号整形的溢出

本文讲述了在C语言编程中遇到的32位有符号整型溢出问题,通过分析代码和汇编语言,揭示了由于类型转换导致的大数值计算错误。作者提供了一个例子,展示如何通过理解溢出来改进算法设计,避免此类问题的发生。
摘要由CSDN通过智能技术生成

最近,笔者当然还是在努力写系统,并且在笔者的“滋润”下,我们的cunix系统已经有一个操作系统的样子了。大家可以看看https://github.com/pengruiyang-cpu/cunix.git,gitee上也有,https://gitee.com/pengruiyang-cpu/cunix.git,有兴趣的当然可以向上面提交代码啦,作为开源与GPL的狂热热爱者,笔者当然欢迎。

今天我们要聊的这个“诡异的数值”,几乎就是一本活生生的教科书,是笔者在编写cunix文件系统时出现的一个问题。代码笔者同样是放在了github上,https://github.com/pengruiyang-cpu/lessons/tree/master/0x00000001/codehttps://gitee.com/pengruiyang-cpu/lessons/tree/master/0x00000001/code

大家可以试试用GCC编译一下:
gcc mkfs.c bitmap.c -o mkfs
编译出mkfs,然后试试用它格式化一个磁盘映像。或者干脆格式化一个不用的磁盘也可以。大家会发现,屏幕上显示出的inode非常少,例如笔者的64GB的U盘(实际57GB可用),竟然只有50000个?

能用的inode竟然只有50000多个

大家最开始得出这个数值一定是怀疑笔者的逻辑写错了,其实并不是,笔者设定的逻辑是,inode大小是磁盘大小的512分之一,而每个inode占用64个字节。所以,57GB的磁盘,inode应该有(57GB / 512 / 641867776个才对,这里竟然只显示50000个,连三十分之一都不到。

而且,这里的代码笔者自认为写的还算漂亮,下面是笔者开始怀疑的问题代码。

int setup_sb(int fd, __uint32_t cblocks) {
   
  superblock_d.magic = SB_MAGIC;
  superblock_d.cblocks = cblocks;printf("blocks count: %u\n", cblocks);/* block bitmap start at second block */
  /* `>> 3` is faster than ` / 8` *//* MINODES_USED = 4GB * 64 = 256GB */
  /* if you want use 4G inodes, you must have a disk with 128TB (MINODES_USED * 512) *//* don't forget `ALIGNUP_4096`! else maybe overflow, I did it :-( */#define BBM_START (0 + 1)
#define BBM_BLOCKS (ALIGNUP_4096(cblocks >> 3))
​
​
  /* on my computer, a 64GB disk will have 2 million inodes, but it takes about only 50000 */#define INODES_COUNT (((cblocks * BLOCK_SIZE) >> 9) / sizeof(struct inode))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值