1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > c语言char197用%d输出变为-59 强制类型转换所导致的数据改变

c语言char197用%d输出变为-59 强制类型转换所导致的数据改变

时间:2020-12-07 09:56:52

相关推荐

c语言char197用%d输出变为-59 强制类型转换所导致的数据改变

强制类型转换所导致的数据改变

char 内存中占用1Byte(字节)=8bit(比特)

char 的数值范围为-128~127

unsigned char 的数值范围为0~255

char c=197;

197的原码为11000101

内存以补码的形式存储数据(正数:原码与补码相同)

197的补码为11000101

如果现在强制用int类型输出数据,int在内存中占用4Byte(字节)。

原本char只占用1Byte(字节),前面还需要补充3个字节。补0还是1取决于该数的二进制最高位的数值,如果为1,前面高位就全补1,如果为0,前面高位就全补0。

197在内存中的补码为11000101 现在强制转换为4Byte(字节)

内存中的补码变为11111111 11111111 11111111 11000101

补码变原码:

(1)如果补码的符号位为“0”,表示是一个正数,所以补码就是该数的原码。

(2)如果补码的符号位为“1”,表示是一个负数,求原码的操作可以是:符号位为1,除符号位外其余各位取反,然后再整个数加1。 (最高位为符号位)

内存补码变为11111111 11111111 11111111 11000101

除符号位外其余各位取反:10000000 00000000 00000000 00111010

再加1:10000000 00000000 00000000 00111011

输出原码为10000000 00000000 00000000 00111011

转化为十进制为-59

如果char的数值大于等于128用%d输出都会改变数值。

128的原码:10000000

128的补码:10000000

用int输出,128的补码为:11111111 11111111 11111111 10000000

输出原码:10000000 00000000 00000000 11111111

如果权位128有数值,在补码中符号位就会为1,如果为1就会以负数输出。

所以如果char的数值小于等于127用%d输出还会得到一样的值,如果大于等于128用%d输出就会改变数值。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。