char、signed char、unsigned char

本文探讨了在不同架构(x86和ARM)下,char、signedchar和unsignedchar之间的区别,通过实验代码展示了char在某些机器上等同于signedchar的情况,并解释了这种等同性取决于编译器和机器的整数存储方式。

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

x86下 char <==> signed char

arm下 char <==> unsigned char


ANSI C 提供了3种字符类型,分别是char、signed char、unsigned char
char相当于signed char或者unsigned char,但是这取决于编译器!
这三种字符类型都是按照1个字节存储的,可以保存256个不同的值。
signed char取值范围是 -128 到 127
unsigned char 取值范围是 0 到 255

但是char究竟相当于signed char呢还是相当于unsigned char呢??
这就是char和int的不同之处!
int==signed int,但是char不能简单以为==signed char

要确定char究竟等同什么要基于不同的编译器做测试
大多数机器使用补码来存储整数,在这些机器中按照整数类型存储的-1的所有位均是1
假设我的机器也是如此存储,就能据此判断char究竟是等于signed char还是unsigned char

程序如下:
[oracle@test c]$ vi test_char.c

#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;
}
"test_char.c" [New] 12L, 148C written
[oracle@test c]$
[oracle@test c]$
[oracle@test c]$
[oracle@test c]$
[oracle@test c]$ cc test_char.c -o test_char
[oracle@test c]$
[oracle@test c]$
[oracle@test c]$ ./test_char
a=-1,b=-1,c=255
[oracle@test c]$

据此可以判断在我的机器上char==signed char

但是绝对不能武断认为char==signed char就好像int==signed int 一样天经地义

说实话今天我就是看书的时候看到这一段说char不简单等同于signed char所以才发问的
刚才收到别人刺激自己找了好多资料还专门打电话问了过去的老师才有所了解

但是我想大部分人还是单纯认为char==signed char的,其实换位思考一下就清楚了
c规定了九种不同的整形其中有char和signed char 和 unsihned char
但是只有int 没有 signed int(二者相等)
如果简单认为char就是等同于signed char的话那8种不就完事了??

如果编译器支持unsigned char和char的等同,设置这个选项就会发现char==unsigned char
这个我还在做测试
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值