在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
中没有意义。怎么办?请帮帮我,我的头要爆炸了!