我有一个带字段的缓冲结构
char inc_factor;
这是字符数组中要增加的字节数。问题是它必须能够保存最多255的值。显然最简单的解决方案是将其更改为unsigned char,但我无法更改提供的结构定义。功能:
Buffer * b_create(short init_capacity, char inc_factor, char o_mode)
接受这些参数并返回指向缓冲区的指针。我想知道如何在有符号的字符中输入数字255。
答案 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的值。