0

我有一个带有字段的缓冲区结构

    char inc_factor;

这是字符数组中要增加的字节数。问题是它必须能够保持最大 255 的值。显然,最简单的解决方案是将其更改为 unsigned char,但我无法更改提供的结构定义。功能:

    Buffer * b_create(short init_capacity, char inc_factor, char o_mode)

接受这些参数并返回一个指向缓冲区的指针。我想知道如何将数字 255 放入签名的字符中。

4

3 回答 3

4

您可以转换类型:

unsigned char n = inc_factor;

有符号到无符号的转换定义明确,可以满足您的要求,因为所有三种 char 类型都需要具有相同的宽度。

您可能需要在调用端小心(或者当您将 存储char在结构中时)并执行类似的操作f(n - UCHAR_MAX)(再次说明,如果这是负数char且未签名,则一切正常)。

于 2013-09-16T21:00:08.487 回答
1

让我们使用术语“字节”来表示内存中的 8 位存储。

值为“0xff”的字节可以作为无符号字符或有符号字符访问。

BYTE byte = 0xff;
unsigned char* uc = (unsigned char*)&byte;
signed char* sc = (signed char*)&byte; // same as "char", the "signed" is a default.
printf("uc = %u, sc = %d\n", *uc, *sc);

(我选择使用指针是因为我想证明存储在内存中的底层值是相同的)。

将输出

uc = 255, sc = -1

“有符号”数字使用与无符号相同的存储空间(位数),但它们使用最高位作为标志来告诉 cpu 是否将它们视为负数。

表示“255”(11111111)无符号的位模式与表示 -1 的位模式相同。位模式“10000000”是 128 或 -127。

因此,您可以将数字“255”存储在有符号字符中,方法是存储“-1”,然后将其转换为无符号整数。

编辑:

如果您想知道:为了计算方便,负数从“顶部”开始(即 0xff/255)。请记住,底层存储是一个字节,因此如果您取“0xff”并加 1,仅使用正常的无符号 cpu 数学运算,它会产生值“0x00”。当“i = -1”时,哪个是“i + 1”的正确值。当然,如果负数以“-1”开头且值为 0x80/128,则同样奇怪。

于 2013-09-16T21:19:22.643 回答
0

你可以施放它。

 (unsigned char)inc_factor = 250;

然后你也可以用演员表读回它:

 if( (unsigned char)inc_factor == 250 ) {...}

但是,这真的不是最佳实践,它会使任何必须维护代码的人感到困惑。

此外,如果您将 inc_factor 传递给需要有符号字符的函数,它不会对您有所帮助。

无法将该值读取为有符号字符并获得高于 128 的值。

于 2013-09-16T21:10:20.673 回答