c标准是否保证有符号和无符号的位模式解释?
C标准是否说明应如何解释位表示?换言之,以下if条件的计算结果是否始终为真?假设sizeof(int)=4,字符位=8c标准是否保证有符号和无符号的位模式解释?,c,bit,standards,signed,representation,C,Bit,Standards,Signed,Representation,C标准是否说明应如何解释位表示?换言之,以下if条件的计算结果是否始终为真?假设sizeof(int)=4,字符位=8 unsigned u = 0xffffffff; if (u == 4294967295) /* do something */ int i = 0xffffffff; if (i == -1) /* do something */ unsigned u = (int)0xffffffff; if (u == 0xffffffff) /* do something */
unsigned u = 0xffffffff;
if (u == 4294967295) /* do something */
int i = 0xffffffff;
if (i == -1) /* do something */
unsigned u = (int)0xffffffff;
if (u == 0xffffffff) /* do something */
int i = hex_literal;
unsigned u;
memcpy (&u, &i, sizeof (u));
if (i == u) /* do something */
if ((i & 0x7fffffff) == (u & 0x7fffffff)) /* do something */
int i = hex_literal;
unsigned u = i;
if (i == u) /* do something */
unsigned u = hex_literal;
int i = u;
if (i == u) /* do something */
int i = hex_literal;
unsigned u = hex_literal;
if (i == hex_literal && u == hex_literal) /* do something */
char c = 0xff;
if (c >> 4 == 0xf) /* do something */
signed char c = 0xff;
if (((c >> 4) & 0xff) == 0xf) /* do something */
无符号数有保证的模2^n算法。对于已签署的文件,没有此类保证
关于位模式什么也没说。注意,0xFFFFFF不是一个“位模式”,它是一个数字(其位模式对C++标准没有意义),如果<0x>代码>是一个32位无符号数,它保证满足X+ 1=0。你分配了0xFFFFFFF。< /P> < P>无符号数保证了模2 ^ n算法。对于已签署的文件,没有此类保证
关于位模式什么也没说。注意,0xFFFFFF不是一个“位模式”,它是一个数字(其位模式对C++标准没有任何意义),如果<代码> x/COD>是一个32位无符号的数字,它保证了x+1=0。对于有符号类型,否;该标准允许2的补码、1的补码或符号幅度表示。本标准(C99)的相关章节为6.2.6.2 另一个问题是,
unsigned u=(int)0xffffffff
等代码调用未定义的行为,因为这会导致整数溢出(第6.3.1.3节)
另一个问题是,诸如
charc=0xff;c>>4
定义实现有两个原因。首先,char
可以是signed
或unsigned
。其次,如果它是有符号的,则实现定义了负数右移(第6.5.7节)。对于无符号,是。对于有符号类型,否;该标准允许2的补码、1的补码或符号幅度表示。本标准(C99)的相关章节为6.2.6.2
另一个问题是,unsigned u=(int)0xffffffff
等代码调用未定义的行为,因为这会导致整数溢出(第6.3.1.3节)
另一个问题是,诸如
charc=0xff;c>>4
定义实现有两个原因。首先,char
可以是signed
或unsigned
。其次,如果它是有符号的,则实现定义了负数右移(第6.5.7节)。要记住的关键项是十六进制文字(例如0x0F
)指的是值(此处:15
),而不是位和字节的物理存储顺序
这取决于机器的存储方式—有些将先存储最低有效位,有些将先存储高位,而在x86上,AFAIK将先存储最低有效字节,但先存储高位
但是,
0x000F
等于15
始终是正确的 要记住的关键项是十六进制文字(例如,0x0F
)指的是值(此处:15
),而不是位和字节的物理存储顺序
这取决于机器的存储方式—有些将先存储最低有效位,有些将先存储高位,而在x86上,AFAIK将先存储最低有效字节,但先存储高位
但是,
0x000F
等于15
始终是正确的 我将增加一个假设,即在讨论中的实现中没有任何类型具有填充位。让我们一次拿一个:
unsigned u = 0xffffffff;
if (u == 4294967295) /* do something */
对
否。将超出范围的数字转换为有符号类型将产生实现定义的结果
unsigned u = (int)0xffffffff;
if (u == 0xffffffff) /* do something */
不,原因与前面的示例相同
int i = hex_literal;
unsigned u;
memcpy (&u, &i, sizeof (u));
if (i == u) /* do something */
if ((i & 0x7fffffff) == (u & 0x7fffffff)) /* do something */
对。该标准保证有符号类型中的每个值位在相应无符号类型的对象表示中具有相同的值
int i = hex_literal;
unsigned u = i;
if (i == u) /* do something */
对。将i
从int
提升到unsigned
是确定的,并在u
赋值和比较中产生相同的值
unsigned u = hex_literal;
int i = u;
if (i == u) /* do something */
是,但仅当hex_literal
在可由int
表示的(正)值范围内时-否则实现定义的结果再次出现
int i = hex_literal;
unsigned u = hex_literal;
if (i == hex_literal && u == hex_literal) /* do something */
u==hex\u literal
将始终求值为true,但是i==hex\u literal
仅当hex\u literal
在可由int
表示的值范围内时才需要这样做
char c = 0xff;
if (c >> 4 == 0xf) /* do something */
char
可以是有符号的,也可以是无符号的。如果未签名,则测试为真;如果已签名,则c
和c>>4
将具有实现定义的值,因此它可能不是真的
signed char c = 0xff;
if (((c >> 4) & 0xff) == 0xf) /* do something */
c
将有一个实现定义的值,因此测试可能不是真的
signed char c = 0xff;
if (((c >> 4) & 0xff) == 0xf) /* do something */
请注意,除了
memcpy()
一个问题之外,您所有的问题都只涉及值,而不是表示。我将补充一个假设,即在讨论的实现中没有类型具有填充位。让我们一次拿一个:
unsigned u = 0xffffffff;
if (u == 4294967295) /* do something */
对
否。将超出范围的数字转换为有符号类型将产生实现定义的结果
unsigned u = (int)0xffffffff;
if (u == 0xffffffff) /* do something */
不,原因与前面的示例相同
int i = hex_literal;
unsigned u;
memcpy (&u, &i, sizeof (u));
if (i == u) /* do something */
if ((i & 0x7fffffff) == (u & 0x7fffffff)) /* do something */
对。该标准保证有符号类型中的每个值位在相应无符号类型的对象表示中具有相同的值
int i = hex_literal;
unsigned u = i;
if (i == u) /* do something */
对。将i
从int
提升到unsigned
是确定的,并在u
赋值和比较中产生相同的值
unsigned u = hex_literal;
int i = u;
if (i == u) /* do something */
是,但仅当hex_literal
在可由int
表示的(正)值范围内时-否则实现定义的结果再次出现
int i = hex_literal;
unsigned u = hex_literal;
if (i == hex_literal && u == hex_literal) /* do something */
u==hex\u literal
将始终求值为true,但是i==hex\u literal
仅当hex\u literal
在可由int
表示的值范围内时才需要这样做
char c = 0xff;
if (c >> 4 == 0xf) /* do something */
char
可以是si