提问人:NithinR 提问时间:9/13/2017 最后编辑:Vlad from MoscowNithinR 更新时间:9/13/2017 访问量:345
不同的数据类型 - 有符号和无符号
Different Data Types - Signed and Unsigned
问:
我刚刚执行了以下代码
main()
{
char a = 0xfb;
unsigned char b = 0xfb;
printf("a=%c,b=%c",a,b);
if(a==b) {
printf("\nSame");
}
else {
printf("\nNot Same");
}
}
对于这段代码,我得到的答案是
一个=?b=?
不同
为什么我没有得到相同,a 和 b 的值是多少?
答:
这条线...在比较之前将字符提升为整数,因此字符的符号会影响这种情况的发生方式。无符号字符 0xFB 变为整数 251;有符号字符 0xFB 变为整数 -5。因此,它们是不平等的。if (a == b)
评论
if (a == b)
char a = 0xfb;
int
0xfb
char
-5
char
存储从 -128 到 127,存储从 0 到 255。
并表示十进制 251,超出了 的限制。unsigned char
0xfb
char a
有 2 种情况需要考虑:
- 如果默认情况下类型为 unsigned,则为 both 和 分配值,程序将打印 .
char
a
b
251
Same
- 如果类型默认是签名的,这是最常见的情况,则定义具有实现定义的行为 AS ( 以十进制表示) 可能超出了该类型的范围 (通常为 )。最有可能的是,该值将被存储到并计算为,因为两个参数都在比较之前被提升到,因此将是假的。
char
char a = 0xfb;
0xfb
251
char
-128
127
-5
a
a == b
0
int
-5 == 251
的行为也与非 ASCII 字符一样依赖于系统,并且可能会以意想不到的方式打印(如果有的话)。但请注意,两者都将打印相同,因为格式指定在打印之前将参数转换为。尝试会更安全、更明确printf("a=%c,b=%c", a, b);
-5
251
%c
unsigned char
printf("a=%d, b=%d\n", a, b);
使用 gcc 或 clang,您可以尝试重新编译您的程序,看看行为会有什么不同。-funsigned-char
评论
a = 0xfb;
根据 C 标准(6.5.9 相等运算符)
4 如果两个操作数都具有算术类型,则通常的算术 执行转换...。
通常的算术转换包括整数提升。
来自 C 标准(6.3.1.1 布尔值、字符和整数)
2 以下可以在表达式中使用,只要 int 或 可以使用无符号 int: ...
如果 int 可以表示原始类型的所有值(作为限制 通过宽度,对于位字段),该值将转换为 int; 否则,它将转换为无符号 int。 这些称为 整数提升。58) 所有其他类型都按整数保持不变 促销。
所以在这个等式表达中
a == b
这两个操作数都转换为类型 。有符号操作数(前提是类型的行为与类型一样)通过传播符号位转换为类型。int
char
signed char
int
因此,由于二进制表示的差异,操作数具有不同的值。
如果类型的行为与类型相同(例如,通过设置编译器的相应选项),那么显然操作数将是相等的。char
unsigned char
评论
下一个:Kotlin 中的平等
评论
signed
unsigned
printf("a=%d,b=%d",a,b);