赋值有更多位然后是左值

时间:2014-12-29 07:18:41

标签: c++ c struct compilation bit-manipulation

出于好奇。我想知道当左值小于指定值时会发生什么。

char a = 0xffffFFFF

此外,请说

struct {
int num:3;
}testStruct;

testStruct.num = 0xffffFFFF/2 -1;

char(第一种情况)和3位整数(第二种情况)中的值是什么

3 个答案:

答案 0 :(得分:6)

您错误地使用了“左值”一词。我猜你的意思是“变量”或“对象”。

如果sizeof(0xFFFFFFFF) == 1和普通字符为unsigned,则char a = 0xffffFFFF;很简单,因为该值可以在char中表示。

在其他情况下,它是超出范围的转换。如果普通字符是无符号的,那么这意味着大的正数0xFFFFFFFF被调整为模UCHAR_MAX+1以适合(在常见系统上,普通字符得到255)。

如果签名了plain char,那么它是实现定义的行为(在C中,可能会引发实现定义的信号)。最常见的实现定义是2的补码截断,它会给char值-1,但这不能保证。


移动到位域。 0xffffFFFF/2 - 10x7FFFFFFE。这被分配给类型int和宽度3的位域,它请求超出范围的转换,就像签名的char情况一样。和以前一样,这是实现定义的(并且可能在C中引发实现定义的信号)。

查找你的编译器文档,找出它在这里指定的内容,虽然我再次期望它会使用2的补码截断,给出-2

答案 1 :(得分:3)

如果目标可以存储值,则保留该值,否则如果目标是无符号,则以模CHAR_MAX + 1减少,否则结果是实现定义的(C允许捕获)。

如果char足够大,

0xFFFFFFFF可能会存储CHAR_BIT


C ++ 14(n3936):

  

3.9.1基本类型[basic.fundamental]

     

[...]在任何特定实现中,普通char对象可以采用与signed charunsigned char相同的值;哪一个是实现定义的。

  

4.7积分转换[conv.integral]

     

1整数类型的prvalue可以转换为另一个整数类型的prvalue。可以将未范围的枚举类型的prvalue转换为整数类型的prvalue   2 如果目标类型是无符号,则结果值是与源整数一致的最小无符号整数(模2n,其中n是用于表示无符号类型的位数)。
  3 如果目标类型已签名,如果可以在目标类型(和位字段宽度)中表示,则该值不会更改;否则,该值是实现定义的。   4如果目的地类型为bool,请参见4.12。如果源类型为bool,则值false将转换为零,值true将转换为一。   5作为整体促销所允许的转化不包括在整数转化中。


尽管C观察到最后一个案例可能陷阱,但是C的规则几乎都有相同的结果 C11(C99 +修正案)(n1570):

  

6.2.5类型

     

15共同调用了三种类型charsigned charunsigned char   字符类型。实现应将char定义为具有相同的范围,   表示和行为为signed charunsigned char。45)

  

6.3.1.3有符号和无符号整数

     

1当整数类型的值转换为_Bool以外的另一个整数类型时,if   该值可以用新类型表示,不变   2否则,如果新类型是无符号的,则通过重复添加或转换该值   减去一个可以在新类型中表示的最大值   直到该值在新类型的范围内.60)
  3否则,新类型已签名且值无法在其中表示;无论是   结果是实现定义的或引发实现定义的信号

答案 2 :(得分:3)

如果value不适合整数类型(int,char,short,long等):

  1. 签名:行为是实施定义的。

  2. 无符号:复制模块值。 (即复制时忽略无法存储的较高位)

  3. 请注意,答案中使用的char可能表现为signed charunsigned char,具体取决于您的编译器和编译标记。

      

    char(第一种情况)和3位整数(in。)中的值是什么   第二种情况)

    答案取决于实现。查看编译器文档以获取适合您环境的准确答案。