C语言基础之:32位机中用printf输出signed char的问题

本文探讨32位机中signed char类型的数值0xe0在printf("%d ", a)输出时,为何结果是-32而不是128。分析了有符号类型在隐式转换为4字节时,高位补符号位导致的结果,并解释了如何按一个字节输出原数值。同时,讨论了如何将0xe0作为无符号数输出为224的方法。" 118733989,10399422,协方差矩阵及其在机器学习中的应用,"['机器学习', '统计学', '数据预处理', 'PCA', '数据分析']
摘要由CSDN通过智能技术生成

在32位机中定义signed char a = 0xe0 ;
执行printf(“%d\n”,a);后a的数值是多少呢?
先分析:
在计算机内部是如何解读0xe0这个数据的呢?
如果当做是无符号数,那在内存的表示就是其原码,如下:
0xe0 = 1110 0000 = 128*1 + 64*1 + 32*1 + 16*0 + 8*0 + 4*0 + 2*0 + 1*0 = 224 (8位机中的表示法)
如果当做有符号数,最高位是符号位,1代表负数,0代表正数。
负数在计算机中是以补码的形式存贮的,也就是原码的各位取反后再加1,符号位不变。
因为最高位是1,所以这个数是负数。现在是已知这个负数在计算机中存贮的数值,求这个负数,顺序就是反过来了,先减一,再取反,符号位不变。如下:
0xe0 = 1110 0000 (8位机中的表示法)
先减一,结果为:x = 1110 0000 - 1 = 1101 1111
再取反,符号位不变,结果为:x = 1010 0000
首位1代表负号,这个数就是:
x = - (0*64 + 1*32 + 0*16 + 0*8 + 0*4 + 0*2 + 0*1) = -32
现在来验证一下-32这个数在计算机内存贮的数值是不是0xe0这个数呢?
因为32 = 0010 0000&

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值