我已经看到这种模式在C&C++中使用了很多.
unsigned int flags = -1; // all bits are true
Run Code Online (Sandbox Code Playgroud)
这是一个很好的便携式方法吗?或正在使用0xffffffff或~0更好?
我有一个int m和一个unsigned int j并且想要确定它们是偶数还是两者都是奇数.
过去我一直在使用
if((int(j)+m)%2)
Run Code Online (Sandbox Code Playgroud)
抓住只有一个奇怪的情况.但是我担心会int不正确地改变奇怪的偶数j.
这些都会遇到问题吗?
if(!(j%2)!=!(m%2))
if(bool(j%2)!=bool(j%2))
Run Code Online (Sandbox Code Playgroud)
我知道
if(j%2!=m%2)
Run Code Online (Sandbox Code Playgroud)
不起作用,因为'm%2'将产生-1何时m为负数,true无论价值j%2是多少,它总是会评估.
为什么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 …
我试图65529从一个转换unsigned int为签名int.我尝试做这样的演员:
unsigned int x = 65529;
int y = (int) x;
Run Code Online (Sandbox Code Playgroud)
但是y当它应该返回-7时仍然返回65529.这是为什么?
我已经在很多地方读过,整数溢出在C中定义得很好,与签名对应物不同.
下溢是一样的吗?
例如:
unsigned int x = -1; // Does x == UINT_MAX?
Run Code Online (Sandbox Code Playgroud)
谢谢.
我不记得在哪里,但我在某处读到无符号整数类型的算术是模块化的,所以如果是这种情况那么-1 == UINT_MAX mod(UINT_MAX + 1).
如果问题看起来很奇怪,我道歉.我正在调试我的代码,这似乎是问题,但我不确定.
谢谢!
可能重复:
在C中签名为无符号转换 - 它总是安全吗?
假设我声明了unsigned int类型的变量: unsigned int x = -1;
现在-1的二进制补码(假设32位机器)为0xFFFFFFFF.现在,当我将此值赋给x时,值0x7FFFFFFF是否已分配给x?
如果是这样,则printf("%d",x); 会打印十进制等效的0x7FFFFFFF,对吧?但是,显然这没有发生,因为打印的值是-1.我在这里错过了什么?
编辑:我知道我们可以使用%u格式说明符来打印无符号值.但这无助于回答上述问题.
根据有符号和无符号整数类型之间的隐式转换规则,这里和这里讨论,当unsigned int用a 求和时int,int首先将signed 转换为a unsigned int.
例如,考虑以下最小程序
#include <iostream>
int main()
{
unsigned int n = 2;
int x = -1;
std::cout << n + x << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
然而,程序的输出是预期的1:x首先转换为a unsigned int,并且总和n导致整数溢出,给出"正确"的答案.
在像前一个代码,如果我知道肯定n + x是积极的,我可以假设的总和unsigned int n,并int x给出了预期值?
int a = -534;
unsigned int b = (unsigned int)a;
printf("%d, %d", a, b);
Run Code Online (Sandbox Code Playgroud)
版画 -534, -534
为什么没有发生类型转换?
我期待它 -534, 534
如果我修改代码
int a = -534;
unsigned int b = (unsigned int)a;
if(a < b)
printf("%d, %d", a, b);
Run Code Online (Sandbox Code Playgroud)
它不打印任何东西......毕竟a不到b?
如果我做这样的事情会发生什么:
unsigned int u;
int s;
...
s -= u;
Run Code Online (Sandbox Code Playgroud)
这个的预期行为是什么:
1)假设无符号整数不是太大而不适合有符号整数?
2)假设无符号整数会溢出有符号整数?
谢谢.