相关疑难解决方法(0)

签署C中的无符号转换 - 它总是安全吗?

假设我有以下C代码.

unsigned int u = 1234;
int i = -5678;

unsigned int result = u + i;
Run Code Online (Sandbox Code Playgroud)

什么隐式转换在这里怎么回事,这是代码为安全的所有值ui?(安全,从某种意义上说,即使此示例中的结果会溢出到某个巨大的正数,我也可以将其转换回int并获得真实的结果.)

c type-conversion

127
推荐指数
3
解决办法
16万
查看次数

为什么unsigned short(multiply)unsigned short转换为signed int?

为什么unsigned short * unsigned short转换为intC++ 11?

int太小的这行代码为证明办理最大值.

cout << USHRT_MAX * USHRT_MAX << endl;
Run Code Online (Sandbox Code Playgroud)

在MinGW 4.9.2上溢出

-131071
Run Code Online (Sandbox Code Playgroud)

因为(来源)

USHRT_MAX = 65535(2 ^ 16-1)或更高*

INT_MAX = 32767(2 ^ 15-1)或更高*

(2^16-1)*(2^16-1) = ~2^32.


我应该期待这个解决方案有什么问题吗?

unsigned u = static_cast<unsigned>(t*t);
Run Code Online (Sandbox Code Playgroud)

这个计划

unsigned short t;
cout<<typeid(t).name()<<endl;
cout<<typeid(t*t).name()<<endl;
Run Code Online (Sandbox Code Playgroud)

给出输出

t
i
Run Code Online (Sandbox Code Playgroud)

gcc version 4.4.7 20120313 (Red Hat 4.4.7-16) (GCC)
gcc version 4.8.2 (GCC)
MinGW 4.9.2
Run Code Online (Sandbox Code Playgroud)

g++ p.cpp
g++ -std=c++11 p.cpp
Run Code Online (Sandbox Code Playgroud)

这证明了t*t …

c++ types type-conversion integer-promotion c++11

22
推荐指数
4
解决办法
4619
查看次数

'包装'乘法溢出的结果是什么?

这里的bcache源包含以下行:

schedule_delayed_work(&dc->writeback_rate_update,
    dc->writeback_rate_update_seconds * HZ);
Run Code Online (Sandbox Code Playgroud)

writeback_rate_update_seconds被定义为unsigned int,在x86_64上似乎是32位,我不确定是什么类型HZ,但我相信该值为1000并假设它是32位或更少.

如果我设置writeback_rate_update_seconds为2147483647,实际传递给什么值schedule_delayed_work?第二个参数schedule_delayed_work似乎是a long,但这并不意味着操作数在乘法溢出之前被提升为long,是吗?

c integer-overflow

9
推荐指数
1
解决办法
291
查看次数