对无符号字符的字符

时间:2013-09-16 20:58:14

标签: c char

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

    char inc_factor;

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

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

接受这些参数并返回指向缓冲区的指针。我想知道如何在有符号的字符中输入数字255。

3 个答案:

答案 0 :(得分:4)

您可以转换类型:

unsigned char n = inc_factor;

签名到无符号转换已经很好地定义并且可以执行您想要的操作,因为所有三种char类型都需要具有相同的宽度。

你可能需要小心调用结束(或者在你的结构中存储char)并做一些类似f(n - UCHAR_MAX)左右的事情(再次,如果这是否定的且char是无符号的,那么一切都很好。

答案 1 :(得分:1)

让我们使用术语“byte”来表示内存中的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

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

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

因此,您可以将数字“255”存储在已签名的字符中,方法是存储“-1”,然后将其转换为unsigned int。

编辑:

在你想知道的情况下:负数开始“在顶部”(即0xff / 255)以便于计算。请记住,底层存储是一个字节,所以如果你取“0xff”并加1,只使用普通的无符号cpu数学,它会产生值“0x00”。当“i = -1”时,“i + 1”的正确值是正确的。当然,如果负数以“-1”开头,其值为0x80 /​​ 128,则同样奇怪。

答案 2 :(得分:0)

你可以施展它。

 (unsigned char)inc_factor = 250;

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

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

但是,这不是最佳做法,它会让任何必须维护代码的人感到困惑。

此外,如果您将inc_factor传递给需要签名字符的函数,它将无法帮助您。

无法将该值读取为带符号的char并获得大于128的值。