直到最近,我还是考虑过大多数系统实现者/供应商的决定,int即使在64位机器上保持简单的32位也是一种权宜之计.随着现代C99固定大小的类型(int32_t和uint32_t等)的需要为了有每个大小为8,16,32的一个标准的整数类型,和64大多消失,并且它似乎是int也可以同样进行64位.
然而,intC 中普通大小的最大实际结果来自于C基本上没有小于int类型的算术.特别是,如果int大于32位,则对uint32_t值的任何算术运算的结果都具有类型signed int,这相当令人不安.
这是否是int在实际实现中永久固定为32位的一个很好的理由?我倾向于说是的.在我看来,uint32_t当int大于32位时,可能存在大量的使用.即使应用一元减号或按位补码运算符也会变得危险,除非你再次使用uint32_t.
当然,同样的问题也适用于uint16_t和uint8_t当前实现,但大家似乎都知道,并用于把它们当作"小-于─ int"类型.
在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,尽管是无符号整数类型,由于可能的有符号整数溢出会导致未定义的行为?