相关疑难解决方法(0)

使得64位的普通int会破坏很多合理的代码吗?

直到最近,我还是考虑过大多数系统实现者/供应商的决定,int即使在64位机器上保持简单的32位也是一种权宜之计.随着现代C99固定大小的类型(int32_tuint32_t等)的需要为了有每个大小为8,16,32的一个标准的整数类型,和64大多消失,并且它似乎是int也可以同样进行64位.

然而,intC 中普通大小的最大实际结果来自于C基本上没有小于int类型的算术.特别是,如果int大于32位,则对uint32_t值的任何算术运算的结果都具有类型signed int,这相当令人不安.

这是否是int在实际实现中永久固定为32位的一个很好的理由?我倾向于说是的.在我看来,uint32_tint大于32位时,可能存在大量的使用.即使应用一元减号或按位补码运算符也会变得危险,除非你再次使用uint32_t.

当然,同样的问题也适用于uint16_tuint8_t当前实现,但大家似乎都知道,并用于把它们当作"小-于─ int"类型.

c 64-bit integer-promotion

15
推荐指数
2
解决办法
641
查看次数

无符号整数递增会导致未定义的定义行为吗?

64位读取32位无符号乘法后导致未定义的行为?关于StackOverflow的问题,我开始思考根据C99标准,对小型无符号类型的典型算术运算是否会导致未定义的行为.

例如,请使用以下代码:

#include <limits.h>

...

unsigned char x = UCHAR_MAX;
unsigned char y = x + 1;
Run Code Online (Sandbox Code Playgroud)

x变量被初始化为最大量值unsigned char的数据类型.下一行是问题:值x + 1大于UCHAR_MAX且不能存储在unsigned char变量中y.

我相信以下是实际发生的事情.

  • 该变量x首先被提升为数据类型int(第6.3.1.1/2节),然后x + 1被评估为数据类型int.

假设有一个实现在哪里INT_MAX并且UCHAR_MAX是相同的 - x + 1会导致有符号整数溢出.这是否意味着递增变量x,尽管是无符号整数类型,由于可能的有符号整数溢出会导致未定义的行为?

c c99 undefined-behavior language-lawyer

5
推荐指数
1
解决办法
219
查看次数