首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C中的signed_extension

C中的signed_extension
EN

Stack Overflow用户
提问于 2011-08-06 22:45:24
回答 2查看 107关注 0票数 3

我已经尝试了下面的程序,并得到了72的输出。我无法理解它是如何输出为72的。

代码语言:javascript
运行
复制
#include <stdio.h>
int main()
{
    int a=0x27ea4d72;
    char x=a;
    printf("%x",x);
    return 0;
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-08-07 01:10:23

来自C标准:

6.3.1.3有符号和无符号整数

unchanged.

  • Otherwise,

  • 当整数类型的值被转换为_Bool以外的其他整数类型时,如果该值可以由新类型表示,则如果新类型是无符号的,则为unchanged.

  • Otherwise,,则通过重复加减新类型中可以表示的最大值的1来转换该值,直到该值处于新类型的范围内。新类型是有符号的,并且该值不能在其中表示;结果是implementation-defined.

转换属于案例#3,因为值是有符号的。所以结果是由实现定义的。

但是,对于代码:

代码语言:javascript
运行
复制
#include <stdio.h>

int main()
{
    unsigned long a = 0x27ea4d72UL;
    unsigned char x = a;
    printf("%x",x);
    return 0;
}

转换落入情况#2,在这种情况下,标准基本上说明结果将是0x27ea4d72% (UCHAR_MAX+1)。其中UCHAR_MAX是255 (最常见的情况),您将得到0x72。

票数 4
EN

Stack Overflow用户

发布于 2011-08-06 23:34:49

由于int通常比char宽,因此char x=a;会截断所分配的int的值。

来自"The New C Standard" book

在转换为更窄的整数类型的情况下,生成的机器码可能取决于对强制转换结果执行的操作。在赋值的情况下,通常存储未转换操作数的适当的最低符号位。对于其他运算符的实现,通常将无符号的符号位清零(执行逐位与运算通常比余数运算更快),对于有符号类型,

扩展结果fi

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6967561

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档