Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c标准是否保证有符号和无符号的位模式解释?_C_Bit_Standards_Signed_Representation - Fatal编程技术网

c标准是否保证有符号和无符号的位模式解释?

c标准是否保证有符号和无符号的位模式解释?,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 */

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 */

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