y = -1和y = 0xFFFFFFFF有什么区别?

时间:2019-10-14 02:23:22

标签: c

y=-1;
y=0xFFFFFFFF;

问题是,这两个语句在您的代码中是否有区别?说明。如果存在差异,请确保提供示例。

我本以为没有区别,但是如果变量y是无符号的,那会有很大的区别?

2 个答案:

答案 0 :(得分:1)

y=-1;
y=0xFFFFFFFF;

-1是类型int的表达式,其值为负1。

0xFFFFFFFF是类型intunsigned intlong intunsigned long int的常量,具体取决于实现方式。其值为4294967295(2 32 -1)。请注意,它从不具有负值。

如果y是有符号整数类型,则第一行将值-1分配给y。如果y是无符号整数类型,则值-1将转换为y的类型,并产生其类型的最大值。

如果4294967295y类型的范围内,则第二行将值4294967295分配给y

如果不是,则y是无符号类型,则将值4294967295减去该类型的最大值加一的模。例如,如果y是16位无符号类型,则分配的值为65535。如果y的签名类型不足以容纳4294967295,则隐式转换将产生实现定义的结果。最常见的是,高阶位被丢弃,但这不是必需的。

例如,如果y是32位有符号整数类型,则y=0xFFFFFFFF将很可能将值-1分配给y

最后,将超出范围的值转换为带符号的整数类型原则上可以引发实现定义的信号(从C99开始),但是我不知道执行此操作的任何实现。

我已经忽略了填充位的可能性。我也忽略了y是浮点型或复杂型的可能性。

如果您告诉我们y的声明方式以及您正在使用的实现中y类型的范围,这个答案可能会短很多。

答案 1 :(得分:0)

四个区别:

  1. 如果您的整数类型大于32位,则值将不同。
  2. 一个常数是有符号的,另一个是无符号的。通常,如果您分配给32位整数,这不会有什么区别,但是某些代码检查器可能会抱怨。
  3. 如果您的C语言已经足够老,则第一行等效于: y = y-1; (这是C版本6的残余。非常老。)将其写为: y = -1;
  4. 如果您的整数系统不是二进制补码,事情会变得很奇怪。