注册 登录
编程论坛 C语言论坛

char -128的整型提升为什么和一般的不一样?

coter123 发布于 2023-02-18 12:45, 877 次点击
char a= -128;
printf("%u",a);

-128 补码:10000001
整型提升后应是:11111111 11111111 11111111 10000001  =4294967169
系统算出来却是4294967168

把char类型换成short,结果也是这个
为什么呢?麻烦大佬解释下
4 回复
#2
rjsp2023-02-18 16:27
首先 char 是否 具符号 属于 实现定义。一般而言,vc默认char具符号,gcc默认char无符号。

从你的现象来看,你用的是 char具符号 的编译器。
要尽量保证 负值的char 在进行类型提升后 它的值依然保持不变,那么 10000000(8bits的具符号类型,值-128) 变为 11111111 11111111 11111111 10000000(32bits的具符号类型,值-128) 有什么不对?
你的问题在于,把 -128(signed int)强制转化成 unsigned int 类型,那么 11111111 11111111 11111111 10000000 当成 无符号整型看待,它就是 4294967168,也没有什么不对

总之,你应该用
char a= -128;
printf("%d",a);
而不是 %u
#3
coter1232023-02-19 08:46
回复 2楼 rjsp
好的,谢谢!
#4
laike232023-02-20 15:45
#5
forever742023-02-21 09:27
以下是引用rjsp在2023-2-18 16:27:05的发言:

首先 char 是否 具符号 属于 实现定义。一般而言,vc默认char具符号,gcc默认char无符号。

从你的现象来看,你用的是 char具符号 的编译器。
要尽量保证 负值的char 在进行类型提升后 它的值依然保持不变,那么 10000000(8bits的具符号类型,值-128) 变为 11111111 11111111 11111111 10000000(32bits的具符号类型,值-128) 有什么不对?
你的问题在于,把 -128(signed int)强制转化成 unsigned int 类型,那么 11111111 11111111 11111111 10000000 当成 无符号整型看待,它就是 4294967168,也没有什么不对

总之,你应该用
char a= -128;
printf("%d",a);
而不是 %u


楼主主要的问题在于把-128的二进制形式写错了一位。
1