复习C++时看到这个:
然后在vscode中试验:
可见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:
ch = -1:
ch = 0:
ch = 1:
ch = 127:
ch = 255:
当 ch < -128 || ch > 255 时,溢出报错。
signed char ch = -1;
时:
总结
对比signed char ch = -1;
和 unsigned char ch = -1;
的情况可知:一个数在内存中的存储方式是固定的,以补码的方式存储。不同数据类型影响的是机器对这些bit位的读法,因此导致变量的值不同。比如,-1在一个字节中的存储方式是 1111 1111,signed char把首位看作符号位,读出来是-1;unsigned char没有符号位,读出来是255。
此外,unsigned char的范围是 0-255,但是在-128 ~ -1也不会报错,但是机器理解的数值与期望不符。