Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在c语言中,将char与unsigned short进行比较时的行为是什么?_C_Char_Compare_Unsigned - Fatal编程技术网

在c语言中,将char与unsigned short进行比较时的行为是什么?

在c语言中,将char与unsigned short进行比较时的行为是什么?,c,char,compare,unsigned,C,Char,Compare,Unsigned,当我运行以下程序时: void func(unsigned short maxNum, unsigned short di) { if (di == 0) { return; } char i; for (i = di; i <= maxNum; i += di) { printf("%u ", i); } printf("\n"); } int main(int

当我运行以下程序时:

void func(unsigned short maxNum, unsigned short di)
{
    if (di == 0) {
        return;
    }

    char i;

    for (i = di; i <= maxNum; i += di) {
        printf("%u ", i);
    }

    printf("\n");
}

int main(int argc, char **argv)
{
    func(256, 100);
    return 0;
}
void func(无符号短maxNum,无符号短di)
{
如果(di==0){
回来
}
char i;

对于(i=di;i我从中得到了答案,char和unsigned short都被翻译成int,可以解释这个程序的过程和结果。

实现定义的行为未定义的行为
char\u MAX<256


让我们整理一下:

... unsigned short maxNum
... unsigned short di
char i;
for (i = di; i <= maxNum; i += di) {
    printf("%u ", i);
}
…无符号短最大值
…无符号短di
char i;

对于(i=di;我猜
char
不会被翻译成
无符号short
@Lucas是的,char和无符号short都会被翻译成有符号int…..令人惊讶的是,我只是想知道,是否有什么好的理由将值包装到范围内?@Lucas使用2的补码有符号类型,包装等同于忽略高位。因此,对于32位到8位,0x12345678变为0x78。使用起来很简单。我只是有点困惑。你是说“对于2的补码符号类型,换行与忽略高位相同”。好的,我同意示例0x12345678变为0x78。但它仍然不清楚。如果
char a=127
然后
a++
产生值
-128
。也就是说,在有符号震级表示中
127=0111
并用1
=127+1=100=00 0=-128增加它。这里我们不是2的补码计算127或包装该值(尽管我们可以假设),我们只是在值127上加1,这将产生带符号类型的值-128。在
带符号幅度表示法中还有一件事,
1 0 0 0 0 0
(仅8位)应该等于
-0
,那么为什么它等于
-128
?如果我们增加忽略位的数量(16位),即
11111111000000
,有意义的是
10000000=128
和其余
1111111111111
代表
-
。但它在8位的
10000000=-128
中没有意义。怎么办?请帮帮我,我的头要爆炸了!