gpt4 book ai didi

c - 溢出

转载 作者:行者123 更新时间:2023-12-02 05:23:44 30 4
gpt4 key购买 nike

我有疑问

两个16位的值加上最大值,16位机会不会溢出?

我会详细说明

unsigned short a;
unsigned short b;
unsigned long c;

c=(unsigned long)(a+b);

谈到 16 位处理器,累加器将是 16 位大小。上面的语句会不会溢出?请澄清。

最佳答案

使用这些定义并假设 unsigned short == 16 位和 int == 16 位和 unsigned long == 32 位(注意int 的大小很重要):

unsigned short a, b;
unsigned long c;

这两个语句会做不同的事情:

c = (unsigned long)(a + b);
c = (unsigned long)a + b;

第一个 - 您展示的那个 - 首先将数字添加为无符号短裤,丢弃任何溢出 - 然后然后扩展为无符号长。这可能就是你问的原因。第二个将 a 转换为无符号长整型,然后将两个数字相加,在进行加法之前将 b 也扩展为无符号长整型。

你也可以这样做:

c = (unsigned long)a + (unsigned long)b;

但这是不必要的,因为计算中存在一个 unsigned long 会导致另一个自动从短尺寸提升为长尺寸。

因此:

a = 0x8001;
b = 0x8001;
c = (unsigned long)(a + b); /* c is assigned 0x00000002 */
c = (unsigned long)a + b; /* c is assigned 0x00010002 */

所有这些都取决于您的特定编译器及其变量的大小。这具体取决于编译器上 int 的大小,因为在计算期间所有值都会自动提升为 intunsigned int。您提到了具有 16 位累加器的硬件,C 编译器通常(但不总是)使用 native 寄存器大小作为 int 的大小,这就是为什么我假设 int为 16 位。

关于c - 溢出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/802153/

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