32位有符号整形的溢出

最近,笔者当然还是在努力写系统,并且在笔者的“滋润”下,我们的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_S
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在MATLAB中,将16进制转换为有符号整型需要使用"hex2dec"函。该函可以将16进制转换为十进制。然而,有符号整型有正负之分,因此需要在转换过程中指定所需的有符号整型的位。 首先,我们需要确定所要转换的16进制的位。假设我们要将一个8位的16进制转换为有符号整型。可以使用以下代码进行转换: hexValue = 'FF'; % 假设要转换的16进制为FF (负) decValue = hex2dec(hexValue); % 将16进制转换为10进制 signedIntValue = int8(decValue); % 将10进制转换为8位有符号整型 在上述代码中,我们首先将16进制'FF'转换为10进制,然后使用'int8'函将10进制转换为8位有符号整型。最终的结果为-1,因为十进制255在8位有符号整型中表示为-1。 同样,如果要将一个16位的16进制转换为有符号整型,可以使用int16函,如果是32位的16进制,则使用int32函,以此类推。 需要注意的是,如果16进制的位超过了目标有符号整型的位,会出现溢出的情况。因此,在进行转换之前,应该确保所选的有符号整型位能够容纳转换后的值,否则可能会导致不正确的结果。 总结起来,将16进制转换为有符号整型,可以使用hex2dec函将16进制转换为10进制,然后根据需要的有符号整型位选择相应的函进行转换,例如int8、int16、int32等。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值