gpt4 book ai didi

c - 位域中的整数表示

转载 作者:行者123 更新时间:2023-12-04 04:47:13 24 4
gpt4 key购买 nike

类型为 signed int 的位域被解释为 signed .
类型为 unsigned int 的位域被解释为 unsigned .

#include <stdio.h>
#include <limits.h>
/* This structure has one 8 bit field, whose type is unsigned int */
struct S
{
unsigned int num: CHAR_BIT;
} x = { 255 };

int main(void)
{

if(x.num - 256 > 0)
printf("signed\n");
else
printf("unsigned\n");

return 0;
}

在 32 位 Windows 机器上,使用 Visual Studio 2008 此代码输出:
“签名”

表达式的类型是什么 (x.num - 256 > 0) ?
如果是 unsigned int , unsigned int不能表示为 int ,因此需要升级到 unsigned int ,结果将是 “未签名 ”?

另外,当我查看汇编列表输出时:
mov eax, DWORD PTR _x
and eax, 255 ; 000000ffH
sub eax, 256 ; 00000100H

因此:
x.num = 0x000000FF
x.num & = 0x0FF -> 0x000000ff
x.num - = 0x100 -> 0xFFFFFFFF

0xFFFFFFFF = -1

如果这是真的,那么:
 if(-1 > 0)   
printf("signed");
else
printf("unsigned");

结果必须是 “未签名” ?

谁能正确解释这些结果?

最佳答案

根据整数提升,“如果一个 int 可以表示原始类型的所有值,则将该值转换为一个 int;否则,它被转换为一个无符号整数。” (这是 C99 中的 6.3.1.1:2)。

int 可以包含宽度为 8 的无符号位域的所有值,因此这个无符号位域被提升为 int .所以x.numx.num - 256两者都有类型 int .

关于c - 位域中的整数表示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18000384/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com