gpt4 book ai didi

c - 如何正确地将负数添加到 size_t

转载 作者:行者123 更新时间:2023-12-03 19:05:01 25 4
gpt4 key购买 nike

我想在我的列表实现中支持负索引,我想处理这个问题的方式(我知道可能有更好的方法来处理负索引)是通过将负值添加到列表中的元素总数。

所以如果我的列表中有 12 个元素,并且我要求索引 -5,我会做 12 + (-5) = 7 所以我将用来检索的真实索引该元素将为 7。

我假设一些类型转换是所有必要的,我可能会尝试一堆类型,如 ptrdiff_t 等等——但我想学习如何确定哪种类型是转换的正确选择。

// the size of the list (normally something like list->num_nodes)
size_t list_size = 12;

// the int32_t is the index argument given to an indexing function
int32_t index = -5;

// the size_t is the real index that can be passed to my internal
// indexing function that will walk from either list head or tail
// depending on whether the index is closer to start or end.
size_t real_index = 0;

// if the index is less than 0 I want to add it to the list size
// to effectively subtract, otherwise just assign it
if (index < 0) {
real_index = (list_size + index); // << warning here
} else {
real_index = (size_t)index;
}

然而,将 int32_t 索引添加到 size_t list_size 会导致 gcc 警告:

warning: conversion to ‘long unsigned int’ from ‘int32_t {aka int}’ may change the sign of the result [-Wsign-conversion]

解决将负 int32_t 添加到像 size_t 这样的无符号值的问题的正确方法是什么?我认为这是一个简单的答案,比如转换为处理 size_t 和 int32_t 的更大类型(int64_t?ptrdiff_t?)......但是你如何确定要转换到哪个类型是正确的(如果这是正确的解决方案)?

最佳答案

您可以转换 int32_tsize_t并添加它。算法将正常工作;添加已转换为无符号值的负值的结果将导致无符号值减去原始负值。

无符号数的算术以 M 为模运算,其中 M 比最大可表示值多一(例如 256 表示 8 位 unsigned char,其最大值是 255)。这包括转化。因此,如果我们有一个无符号 a 和一个有符号负数 b,将 b 转换为无符号类型会产生 M + b(注意,由于 b 是负数,M + b 小于 M )。然后添加 a 在数学上是 a + M + b,其中模 M , 是 a + b

关于c - 如何正确地将负数添加到 size_t,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57208230/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com