【C语言】告诉你为什么unsigned char a=-1;%d打印出来是255

文章探讨了C语言中自动类型转换的过程,特别是char、signedchar和unsignedchar在赋值和打印时的行为。通过示例代码解释了-1赋值给不同类型的char变量后,打印结果为-1和255的原因,涉及到二进制补码表示法和类型提升的原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、自动类型转换流程

 要注意的是: 在进行自动类型转换时,原数据的类型没有改变,而是得到一个转化后的中间变量

并不是char转化成int又转化成long······

进入正题

来看一段代码,猜一猜打印的结果是什么

#include <stdio.h>
int main()
{
	char a = -1;
    signed char b = -1;
	unsigned char c = -1;
	printf("a=%d,b=%d,c=%d", a, b, c);
	return 0;
}

结果是:a=-1,b=-1,c=255

可以认为,在当前编译器下,char 等价于signed char

我们知道C语言中为一个字符分配一个字节(8位),一个int整型分配4个字节(32位)

整形数据用整数的补码形式存放


- 1

原码:1000 0000 0000 0000 0000 0000 0000 0001

反码:1111 1111 1111 1111 1111 1111 1111 1110

补码:1111 1111 1111 1111 1111 1111 1111 1111


-1赋给char型变量 a, 从后边截断8位

a

补码:1111 1111

当用%d打印时,进行自动类型转化,认为a的最高位是符号位,最高位为1,从左补1,直至32位

打印a的中间变量补码为:

        1111 1111 1111 1111 1111 1111 1111 1111

        1000 0000 0000 0000 0000 0000 0000 0000

原码:1000 0000 0000 0000 0000 0000 0000 0001

所以a打印的是-1,b同理


c是unsigned char 类型,当用%d打印时,进行自动类型转化,编译器认为c的最高位不是符号位,从左补0,直至32位

因此打印c的中间变量补码为:

0000 0000 0000 0000 0000 0000 1111 1111

转化为十进制为255

所以c打印出来的的是255

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值