0
点赞
收藏
分享

微信扫一扫

关于变量类型、内存方式

晚安大世界 2022-02-12 阅读 79

复习C++时看到这个:

image-20220212145948740

然后在vscode中试验:

image-20220212150102823

可见char默认是unsigned char。

问题

signed char chh = -1;
printf("%d", chh);  // 输出 -1
unsigned char chh = -1;
printf("%d", chh);  // 输出 255 为什么

解决

如何按内存字节输出值:

  • 利用char*指针

    char* ptr =(char*)&var;
    for(int i=0;i<sizeof(var);i++)
    {
    	printf("%x \t %x \n",(ptr+i),*(ptr+i));
    }
    

然后,在vscode中测试输出:

unsigned char ch = -1;

char* c =(char*)&ch;
for(int i=0;i<sizeof(ch);i++)
{
	printf("%x \t %x \n",(c+i),*(c+i));
}

printf("%d", ch);

ch = -128:

image-20220212152428049

ch = -1:

image-20220212152141479

ch = 0:

image-20220212152309888

ch = 1:

image-20220212152330693

ch = 127:

image-20220212152526131

ch = 255:

image-20220212152627249

当 ch < -128 || ch > 255 时,溢出报错。

signed char ch = -1; 时:

image-20220212153153200

总结

对比signed char ch = -1;unsigned char ch = -1; 的情况可知:一个数在内存中的存储方式是固定的,以补码的方式存储。不同数据类型影响的是机器对这些bit位的读法,因此导致变量的值不同。比如,-1在一个字节中的存储方式是 1111 1111,signed char把首位看作符号位,读出来是-1;unsigned char没有符号位,读出来是255。

此外,unsigned char的范围是 0-255,但是在-128 ~ -1也不会报错,但是机器理解的数值与期望不符。

举报

相关推荐

0 条评论