- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
当下面的代码针对像 MSP430 微 Controller 这样的 16 位整数机器运行时,s32
产生 65446
#include <stdint.h>
uint16_t u16c;
int32_t s32;
int main()
{
u16c = 100U;
s32 = 10 - u16c;
}
我的理解是 10 - u16c
将隐式类型提升为 unsigned int。在数学上 10 - u16c
等于 -90。但是如何将负数表示为 unsigned int?
当 -90 被提升为 unsigned int 时,是否意味着忽略数字的符号?
让我们假设,一个数字的符号被忽略了。
90 的二进制表示是 00000000 01011010
。当它被分配给 s32
时,它是 32 位宽的有符号整数变量,转变是如何发生的?
为了使 s32
等于 65446,90 必须采用 2 的补码。那将是 00000000 10100110
。
我对s32
变成65446的过程没有信心。
在像 ARM CORTEX 这样的 32 位宽整数机器中,s32
是 -90,这是正确的。
要在 16 位整数机中解决这种情况,需要为 u16c
类型转换为 (int16_t)
。这如何解决这个问题?
添加了 s32
的十六进制数据表示,如 IAR Workbench(右下角)所示。显示s32
变为0x0000FFA6
。因此对于 MSP430,从无符号 16 位转换为有符号 32 位的机器实现,它只是在前面加上 16 个 0 位。
最佳答案
My understanding is that
10-u16c
gets implicit type promotion tounsigned int
.
这取决于 10
类型的表示(可以说是 int
)。您的理解对于某些系统是正确的,我们将首先介绍这一点,但正如您稍后将在本回答中看到的那样,您遗漏了很大一部分内容。
Section 5.2.4, Environmental limits指定 int
类型的值范围从 -32767 到 32767;这个范围可以根据实现的判断进行扩展,但是 int
值必须能够代表这个范围。
uint16_t
,但是,如果它存在(它不是必需的)的范围从 0 到 65535。实现不能扩展那;要求范围精确 [0..65535]
(因此不需要存在此类型的原因)。
Section 6.3.1.3, Signed and unsigned integers告诉我们来回转换。我无法更好地解释它,所以这是直接引用:
1 When a value with integer type is converted to another integer type other than _Bool, if the value can be represented by the new type, it is unchanged.
2 Otherwise, if the new type is unsigned, the value is converted by repeatedly adding or subtracting one more than the maximum value that can be represented in the new type until the value is in the range of the new type.60)
3 Otherwise, the new type is signed and the value cannot be represented in it; either the result is implementation-defined or an implementation-defined signal is raised.
这一切都支持您的理论,即 int
值 10 将转换为 uint16_t
当且仅当 int
是一个十六位类型。 然而,section 6.3.1.8, usual arithmetic conversion应首先应用规则来决定发生上述三种转换中的哪一种,因为当 int
大于 16 位时,这些规则会改变您查看转换的方式:
If both operands have the same type, then no further conversion is needed.
Otherwise, if both operands have signed integer types or both have unsigned integer types, the operand with the type of lesser integer conversion rank is converted to the type of the operand with greater rank.
Otherwise, if the operand that has unsigned integer type has rank greater or equal to the rank of the type of the other operand, then the operand with signed integer type is converted to the type of the operand with unsigned integer type.
Otherwise, if the type of the operand with signed integer type can represent all of the values of the type of the operand with unsigned integer type, then the operand with unsigned integer type is converted to the type of the operand with signed integer type.
Otherwise, both operands are converted to the unsigned integer type corresponding to the type of the operand with signed integer type.
因此,从这里可以看出,表达式 10-u16c
的类型可能因系统而异。在 int
为 16 位的系统上,该表达式将是 uint16_t
。
Mathematically 10-u16c equals to -90. But how is it possible to represent a negative number as an unsigned int. When -90 gets promoted to unsigned int, does it mean that the sign of a number is ignored?
根据 Annex H.2.2 :
C's unsigned integer types are ''modulo'' in the LIA-1 sense in that overflows or out-of-bounds results silently wrap.
换句话说,如果 10
被转换为 uint16_t
并执行减法,结果将是一个大数,在在这种情况下,您可以通过将两个操作数显式转换(即将它们转换)为 uint16_t
来查看该数字。您可以通过使用无符号整数常量(如 -90U
)看到类似的效果。这在很大程度上得到了前面 6.3.1.3 中引述的规则 #2 的支持。
When this gets assigned to s32 which is 32 bit wide signed integer variable, how does the transformation takes place?
表达式 10-u16c
根据 6.3.1.3 中的规则 #1(上面引用)转换为 int32_t
值并存储为该值。
To fix this situation in 16bit integer machine, there needs a typecast of
(int16_t)
foru16c
. How does this remedy this problem?
类型转换没有为该讨论添加有用的信息。也许您使用的是不兼容(错误)的编译器。我怀疑手册可能会对此有所说明,但由于我不知道你使用的是哪个编译器,我无法阅读它......
关于c - 减法中 16 位 int 机器和 32 位 int 机器之间的不同结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44081308/
我被难住了。如果我对文件路径进行硬编码,则此脚本在我的 Windows 机器上的 Eclipse 中运行良好。如果我尝试接受参数并在我的边缘节点(一个 linux 机器)上运行它,它不会抛出任何特定的
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 关闭 8 年前。 这个问题似乎不是关于 a specific programming problem,
我们最近将我们的基础架构从 Solaris(Oracle/Sun Java) 迁移到 AIX(IBM Java)。 我们的客户将使用我们共享的算法(AES)和 key 上传加密文件,一旦加密文件放置在
我想编写一个程序(java),它接受一个文件作为输入,对其进行加密(使用aes128)并通过ftp发送该加密文件,接收者接收它并使用 key 进行解密。我是初学者,有什么帮助可以做到这一点吗?非常感谢
我正在尝试将一些为 1c2 机器 (thumb) 编译的 DLL 导入 WinMobile 6.1 C# 智能设备项目。 然而,当我尝试将它们导入我的 C# 项目时,我得到“无法添加对...的引用”,
我正在寻找 FPGA + 机器。 它应该是入门级定价(例如不超过 200 美元)。 编辑:我想制作一个 ASM 图表并将 FPGA 编程为我在图表中指定的行为 最佳答案 你看过Arduino ? 关于
这是我想完成的: Write a program that stimulates a bean machine Your program should prompt the user to enter
我尝试使用以下命令在 Windows 10 上使用 hyperv 创建一台机器: docker-machine create --driver hyperv default 但它给了我: This m
我有个问题 我的问题是我有一个将 mapred.map.tasks 配置为10的作业(抓取工具),这意味着我的工作将一次创建10个映射器。但是我的集群将 mapred.tasktracker.map.
我正在尝试使用命令重新启动 Docker sudo docker restart a7f8ce75f51f 但我收到以下错误 Error response from daemon: Cannot re
在新机器上引导 Eclipse 是一个非常耗时的过程,您最终会问自己是否真的需要每个插件。但这些都很方便,并且有助于养成一致的习惯。 Eclipse 引导问题包括: 解释/记录需要发生的事情 粘贴正确
我们希望建立一个 Docker 开发节点,我们团队中的任何人都可以将东西部署到其中。 我使用 SSH 创建了一个新的 Docker 机器,如下所示: docker-machine create \
如果可能的话,我想使用 java.util.logging 来做到这一点,有什么想法吗?谢谢。 最佳答案 您可以尝试一下SLF4J . Simple Logging Facade for Java (
当 vagrant up 时,我们的 vagrant box 需要大约 1 小时才能提供第一次运行,在配置过程的最后,我想将盒子打包到本地文件夹中的图像,以便下次需要重建时将其用作基础盒子。我正在使用
我正在为我的图像处理项目构建一个 SVM 线性机,在其中提取正样本和负样本的特征并将其保存到目录中。然后,我使用这些功能训练 SVM,但收到一个无法调试的错误。下面是我用于训练分类器的 train-c
问题描述: 我要将MySQL server 5.7.11 (win32) 安装到Windows server 2012 中。服务器中安装了多个网络接口(interface)卡,我将安装多个绑定(bin
我想安排一台 (AWS) Linux 计算机启动、运行程序,然后自行关闭(以将成本保持在最低水平)。我可以放 mycommand; shutdown 在/etc/rc.local 文件中。但如果我需要
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 4 年前。 Improve this ques
如何将此文件的输出发送到另一台 Linux 计算机的主目录。 显然,我想发送此文件的输出: sed '/^\s*#/d;/^$/d' /etc/httpd/conf/httpd.conf 到 nati
我有一个 Linux 机器,我可以使用 SSH 进行 root 访问。 我想使用GDB来调试系统。 这是一个精简的 Debian 软件包;因此,我里面没有任何编译工具。 uname -a 给出: 2.
我是一名优秀的程序员,十分优秀!