首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C中的隐式类型转换(将32位无符号输入转换为8位u int)

C中的隐式类型转换(将32位无符号输入转换为8位u int)
EN

Stack Overflow用户
提问于 2010-06-28 22:46:33
回答 4查看 27.4K关注 0票数 10

我的问题看起来很像

How to store a 64 bit integer in two 32 bit integers and convert back again

(我有一个无符号的32位,我需要放入C中的4个无符号8位变量中)

我的问题是这是否:

代码语言:javascript
复制
uint8_t a;
uint32_t b;
a = b;

保证a由最右边的八位填充,而不是最左边的八位?

EN

回答 4

Stack Overflow用户

发布于 2010-06-28 22:58:05

是。执行以下任一操作:

代码语言:javascript
复制
uint32_t num32 = 0xdeadbeef;

uint8_t a = num32;       /* 0xef */
uint8_t b = num32 >> 8;  /* 0xbe */
uint8_t c = num32 >> 16; /* 0xad */
uint8_t d = num32 >> 24; /* 0xde */

或者这样:

代码语言:javascript
复制
union u
{
    uint32_t num32;

    struct
    {
        uint8_t a;
        uint8_t b;
        uint8_t c;
        uint8_t d;

    } bytes;

} converter;

converter.num32 = 0xdeadbeef;

第一个示例不依赖于平台字节顺序,第二个依赖于平台字节顺序。

票数 16
EN

Stack Overflow用户

发布于 2010-06-28 22:52:48

我不知道你说的最右边和最左边是什么意思(字节顺序?)但C保证a将包含b的8个低位(最低有效)位。也就是说,赋值在逻辑上等同于:

代码语言:javascript
复制
a = b % ((uint32_t)UINT8_MAX + 1);
票数 9
EN

Stack Overflow用户

发布于 2010-06-28 22:59:08

根据C标准,可以保证a == b % (max_of_uint8_t + 1),即最低有效的8比特。在§6.3.1.3 (有符号和无符号整数)中:

  1. 当整数类型的值被转换为_Bool以外的其他整数类型时,如果该值可以由新类型表示,则如果新类型是无符号的,则为,通过重复添加或减去比新类型可以表示的最大值多一的值来转换该值,直到该值在新类型的范围内为止

如果需要安全起见,请使用a = b & 0xff

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

https://stackoverflow.com/questions/3133376

复制
相关文章

相似问题

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