出于好奇。我想知道当左值小于指定值时会发生什么。
char a = 0xffffFFFF
此外,请说
struct {
int num:3;
}testStruct;
testStruct.num = 0xffffFFFF/2 -1;
char(第一种情况)和3位整数(第二种情况)中的值是什么
答案 0 :(得分:6)
您错误地使用了“左值”一词。我猜你的意思是“变量”或“对象”。
如果sizeof(0xFFFFFFFF) == 1
和普通字符为unsigned
,则char a = 0xffffFFFF;
很简单,因为该值可以在char
中表示。
在其他情况下,它是超出范围的转换。如果普通字符是无符号的,那么这意味着大的正数0xFFFFFFFF
被调整为模UCHAR_MAX+1
以适合(在常见系统上,普通字符得到255
)。
如果签名了plain char,那么它是实现定义的行为(在C中,可能会引发实现定义的信号)。最常见的实现定义是2的补码截断,它会给char值-1
,但这不能保证。
移动到位域。 0xffffFFFF/2 - 1
是0x7FFFFFFE
。这被分配给类型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 char
或unsigned char
相同的值;哪一个是实现定义的。
4.7积分转换
[conv.integral]
1整数类型的prvalue可以转换为另一个整数类型的prvalue。可以将未范围的枚举类型的prvalue转换为整数类型的prvalue 2 如果目标类型是无符号,则结果值是与源整数一致的最小无符号整数(模2n,其中n是用于表示无符号类型的位数)。
3 如果目标类型已签名,如果可以在目标类型(和位字段宽度)中表示,则该值不会更改;否则,该值是实现定义的。 4如果目的地类型为bool,请参见4.12。如果源类型为bool
,则值false
将转换为零,值true
将转换为一。 5作为整体促销所允许的转化不包括在整数转化中。
6.2.5类型
15共同调用了三种类型
char
,signed char
和unsigned
char 字符类型。实现应将char
定义为具有相同的范围, 表示和行为为signed char
或unsigned char
。45)
6.3.1.3有符号和无符号整数
1当整数类型的值转换为
_Bool
以外的另一个整数类型时,if 该值可以用新类型表示,不变 2否则,如果新类型是无符号的,则通过重复添加或转换该值 减去一个可以在新类型中表示的最大值 直到该值在新类型的范围内.60)
3否则,新类型已签名且值无法在其中表示;无论是 结果是实现定义的或引发实现定义的信号。
答案 2 :(得分:3)
如果value不适合整数类型(int,char,short,long等):
签名:行为是实施定义的。
无符号:复制模块值。 (即复制时忽略无法存储的较高位)
请注意,答案中使用的char
可能表现为signed char
或unsigned char
,具体取决于您的编译器和编译标记。
char(第一种情况)和3位整数(in。)中的值是什么 第二种情况)
答案取决于实现。查看编译器文档以获取适合您环境的准确答案。