当前位置: 首页 > 知识库问答 >
问题:

有符号字符到无符号整数转换的标准C行为

裴嘉良
2023-03-14

我快速浏览了C 03标准,但仍然无法判断这种行为是否有保证:

signed char cNegOne=-1; //char is 8bits
unsigned int a=cNegOne; //int is 32 bits in my Windows system
printf("0x%x\n",a);

结果是:

0xffffffff

VC在32位窗口中给出<code>0xffffffff。但我的假设是,转换可以通过两种方式进行:

1) 8位有符号字符-1首先直接转换为8位无符号值,该值为二进制11111111或十进制255,然后扩展为32位无符号整数,给出255(0xff)。

2)8位有符号字符-1被有符号扩展到32位有符号int,给出0xffffffff,然后重新解释为32位无符号int。

显然这里使用了第二种方式。但是为什么会这样呢?在标准中,我找不到任何关于这个的东西。它是实现特定的吗?

编辑:C 03第4章的原文

标准转换是为内置类型定义的隐式转换。第 4 条列举了此类转换的全部集合。标准转换序列是按以下顺序排列的标准转换序列:

-以下集合的零或一个转换:左值到右值转换、数组到指针转换和函数到指针转换。

-以下集合中的零或一个转换:整数提升、浮点提升、整数转换、浮点转换、浮点积分转换、指针转换、指针到成员转换和布尔转换。

— 零次或一次资格转换。

请注意,保证顺序是l到右值转换(etc)发生在集合积分提升/转换之前,但这并不意味着积分提升必须发生在转换之前——它们只是在同一个集合中。或者我的解释是正确的?

共有1个答案

澹台冯浩
2023-03-14

当在C和C中执行整数算术时,第一步是整数提升。签名的字符和短裤成为签名的ints;无符号字符和短整型成为无符号整数。即使您将两个短路相加,也是如此:操作本身是在整数上执行的,而不是在短路上执行的。

因此,当您考虑整数转换时,请考虑提升以及随后的符号变化。在C标准中,这两个步骤被描述为一个步骤。也就是说,单独的整数提升在技术上不会发生,但是如果目标类型比源类型宽,则改变有符号性的效果与在有符号性改变之前进行显式提升的效果是相同的。基本规则是,结果必须是输入模2^n,其中n是输出类型的位数。对于-1的输入和32位输出类型,这意味着2^32 - 1的输出。

 类似资料:
  • 问题内容: 在Java中,是否有一种简单而优雅的方法将无符号字节值转换为有符号字节值?例如,如果我所拥有的只是int值240(二进制(24位+ 11110000)= 32bits),如何获得该int的带符号值? 问题答案: 除了,Java没有其他无符号值。考虑以下代码段: 结果将为-1,因为最低的8位已复制到byte变量中。

  • 我想优化我的代码,避免错误,我有这个功能,但我认为我可以改善和避免内存问题。 该函数的思想是接收这种样式的字符串“0123456789”并将其传递给0x01、0x23、0x45、...在无符号字符数组中。任何提示,良好的实践或改进将是非常有用的。 用法是这样的: 在函数缓冲区中结束如下:

  • 问题内容: 假设我有这个号码。我如何将其称为无符号变量?像C一样 问题答案: 假设 : 您会想到2的补码表示法;和, 通过您 的意思是 32位无符号整数, 那么您只需将其添加为负值即可。 例如,将此应用于-1: 假设1表示您希望将-1视为一个1位的实字符串,而假设2表示您希望其中的32个。 但是,除了你,没人可以说你隐藏的假设是什么。例如,如果考虑到1的补码表示形式,则需要应用前缀运算符。Pyth

  • 我正在接收 无符号到整数的隐式转换 使用以下代码: 但是当我将方法的 路由到< code > Admin::questions controller 的< code>create方法,为什么它不起作用?我是rails和命名空间的新手,所以我可能忽略了一些显而易见的东西。 编辑: 问题控制器的命名空间在admin下。

  • 我在尝试将未签名的 char 数组转换为 jstring 时遇到问题。 上下文是我正在使用来自Java的共享c库。所以我正在实现一个JNI c文件。我在库中使用的函数会恢复 我在 JNI C 文件中实现的函数返回一个 jstring。 所以我需要把无符号的char数组转换成jstring。 但是,尽管数组应该只包含20个字节,但我在Java中随机得到22或23个字节......(虽然 20 个字节

  • 问题内容: 在C语言中,我可以使用数字做一些技巧: 在Swift中有没有办法做到这一点?请注意,相同的方法无效: 有没有一种方法可以让C的行为在Swift中减法? 谢谢! 问题答案: 所有有符号和无符号整数类型都有一个构造函数,该构造函数从具有相同内存表示形式的有符号(反之亦然)创建无符号数字: