在这种情况下,unsigned char和unsigned short有什么区别?

4
我们需要将使用unsigned char作为位掩码的程序升级到新版本,该新版本使用unsigned short作为位掩码。我相信它们之间存在一些差异,因为我们的程序在将unsigned char更改为unsigned short后,无法使用相同的逻辑运行。(这来自我们购买的外部库。该库已升级,所以我们也需要更改程序)。
Old version:
typedef struct SomeStruct {
    unsigned char   bit_mask;
#       define      SomeStruct_a_present 0x80
#       define      SomeStruct_b_present 0x40
#       define      SomeStruct_c_present 0x20
    X          x;
    Y          y;
    A          a;  /* optional; set in bit_mask
                                * SomeStruct_a_present if
                                * present */

    B          b;  /* optional; set in bit_mask
                                * SomeStruct_b_present if
                                * present */

    C          c;  /* optional; set in bit_mask
                                * SomeStruct_c_present if
                                * present */
} SomeStruct;



New version:
typedef struct SomeStruct {
    unsigned short   bit_mask;
#       define      SomeStruct_x_present 0x8000
#       define      SomeStruct_y_present 0x4000
#       define      SomeStruct_a_present 0x2000
#       define      SomeStruct_b_present 0x1000
#       define      SomeStruct_c_present 0x0800
    X          x;/* optional; set in bit_mask
                                * SomeStruct_x_present if
                                * present */
    Y          y;/* optional; set in bit_mask
                                * SomeStruct_y_present if
                                * present */
    A          a;  /* optional; set in bit_mask
                                * SomeStruct_a_present if
                                * present */

    B          b;  /* optional; set in bit_mask
                                * SomeStruct_b_present if
                                * present */

    C          c;  /* optional; set in bit_mask
                                * SomeStruct_c_present if
                                * present */
} SomeStruct;

我认为我们当前的线路存在问题,因为程序崩溃了:
我们当前设置 bit_mask 的方法是:
someStruct.bit_mask = SomeStruct_a_present;
someStruct.bit_mask |= SomeStruct_b_present;
someStruct.bit_mask |= SomeStruct_c_present;

1
程序在哪里崩溃? - alk
4个回答

7
 I believe there is some difference between( unsigned short and unsigned char)

unsigned char的大小为1字节。

unsigned short的大小为2字节。


6

使用无符号短整型,这行代码如下:

someStruct.bit_mask = SomeStruct_a_present;

将位掩码的值设置为8192,但是使用无符号字符,该值将被设置为128

原因:

无符号短整型长度为2个字节,位掩码将是00100000000000000x2000),然而使用无符号字符时,该值将变为100000000x80)。


然而,这会对OR操作产生什么影响? - lamwaiman1988
@lamwaiman1988:是的,位位置不同。尝试在计算器的程序员模式下进行操作,你会看到的 :) - perilbrain

1

"unsigned char" 的长度为1字节,而 "unsigned short" 的长度为2。


0

MODIFIERS部分下的链接这里可以看出,

sizeof(unsigned char) = 1字节,范围为0 -> +255。

sizeof(unsigned short) = 2字节,范围为0 -> +65,535。

Ideone输出


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接