假设我有以下C代码.
unsigned int u = 1234;
int i = -5678;
unsigned int result = u + i;
Run Code Online (Sandbox Code Playgroud)
什么隐式转换在这里怎么回事,这是代码为安全的所有值u和i?(安全,从某种意义上说,即使此示例中的结果会溢出到某个巨大的正数,我也可以将其转换回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 …
这里的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,是吗?