我遇到的代码来自一个似乎认为在结果为负时从另一个相同类型的整数中减去无符号整数的问题.因此,即使它恰好适用于大多数体系结构,这样的代码也是不正确的.
unsigned int To, Tf;
To = getcounter();
while (1) {
Tf = getcounter();
if ((Tf-To) >= TIME_LIMIT) {
break;
}
}
Run Code Online (Sandbox Code Playgroud)
这是我能找到的C标准中唯一含糊不清的引用.
涉及无符号操作数的计算永远不会过度流动,因为无法用结果无符号整数类型表示的结果将以比结果类型可以表示的最大值大1的数量为模.
我想人们可以接受这个引用来表示当右操作数较大时,操作被调整为在模数截断数字的上下文中有意义.
即
0x0000 - 0x0001 == 0x 1 0000 - 0x0001 == 0xFFFF
而不是使用依赖于实现的签名语义:
0x0000 - 0x0001 ==(无符号)(0 + -1)==(0xFFFF但也是0xFFFE或0x8001)
哪种或哪种解释是对的?是否定义了?
我很困惑size_t.我在互联网上搜索过并且提到的size_t是无符号类型,因此它可以表示非负值.
我的第一个问题是,如果它用于表示非负值,为什么我们不使用 unsigned int而不是size_t?
我的第二个问题是:是size_t和unsigned int可互换的?如果不是那么为什么?
谁能给我一个很好的例子size_t和简短的工作?
我已经看过这种unsigned"无类型"类型使用了几次,但从未见过它的解释.我想有一个相应的signed类型.这是一个例子:
static unsigned long next = 1;
/* RAND_MAX assumed to be 32767 */
int myrand(void) {
next = next * 1103515245 + 12345;
return((unsigned)(next/65536) % 32768);
}
void mysrand(unsigned seed) {
next = seed;
}Run Code Online (Sandbox Code Playgroud)
到目前为止我收集的内容:
- 在我的系统上,sizeof(unsigned) = 4(提示32位无符号整数)
- 它可以用作将另一种类型转换为无符号版本的简写:
signed long int i = -42;
printf("%u\n", (unsigned)i);
Run Code Online (Sandbox Code Playgroud)
这是ANSI C,还是仅仅是编译器扩展?
unsigned关键字是否默认为C++中的特定数据类型?我正在尝试为原型的类编写函数:
unsigned Rotate(unsigned object, int count)
Run Code Online (Sandbox Code Playgroud)
但我真的没有unsigned办法.不应该是unsigned int什么样的东西?
在Oracle"原始数据类型" 页面中,它提到Java 8增加了对无符号整数和长整数的支持:
int:默认情况下,int数据类型是32位带符号的二进制补码整数,其最小值为-2 31,最大值为2 31 -1.在Java SE 8及更高版本中,您可以使用int数据类型表示无符号的32位整数,其最小值为0,最大值为2 32 -1.使用Integer该类将int数据类型用作无符号整数.有关更多信息,请参阅数字类一节.像静态方法compareUnsigned,divideUnsigned等已被添加到Integer类,以支持算术运算的无符号整数.
long:long数据类型是64位二进制补码整数.签名long的最小值为-2 63,最大值为2 63 -1.在Java SE 8及更高版本中,您可以使用long数据类型表示无符号64位long,其最小值为0,最大值为2 64 -1.当需要比int提供的值更宽的值时,请使用此数据类型.本Long类也包含类似的方法compareUnsigned,divideUnsigned等支持算术运算的无符号long.
但是,我发现无法声明无符号长整数或整数.例如,下面的代码给出了编译器错误消息"文字超出范围"(我当然使用的是Java 8),当它应该在范围内时(指定的值恰好是2 64 -1) :
public class Foo {
static long values = 18446744073709551615L;
public static void main(String[] args){
System.out.println(values);
}
} …Run Code Online (Sandbox Code Playgroud) 我试图理解为什么以下代码不会在指定的位置发出警告.
//from limits.h
#define UINT_MAX 0xffffffff /* maximum unsigned int value */
#define INT_MAX 2147483647 /* maximum (signed) int value */
/* = 0x7fffffff */
int a = INT_MAX;
//_int64 a = INT_MAX; // makes all warnings go away
unsigned int b = UINT_MAX;
bool c = false;
if(a < b) // warning C4018: '<' : signed/unsigned mismatch
c = true;
if(a > b) // warning C4018: '<' : signed/unsigned mismatch
c = true;
if(a <= b) // warning C4018: …Run Code Online (Sandbox Code Playgroud) 我目前正在编写一个需要频繁比较字符串长度的C程序,所以我编写了以下辅助函数:
int strlonger(char *s1, char *s2) {
return strlen(s1) - strlen(s2) > 0;
}
Run Code Online (Sandbox Code Playgroud)
我注意到,即使s1长度比短,函数返回true s2.有人可以解释这种奇怪的行为吗?
在我的代码中,我不使用int或unsigned int.我只使用size_t或ssize_t进行移植.例如:
typedef size_t intc; // (instead of unsigned int)
typedef ssize_t uintc; // (instead of int)
Run Code Online (Sandbox Code Playgroud)
因为strlen,string,vector...全部使用size_t,所以我通常使用size_t.我只会ssize_t在它可能是负面时使用.
但我发现:
无符号整数类型非常适合将存储视为位数组的用途.使用无符号而不是int来再获得一位来表示正整数几乎不是一个好主意.通过声明无符号变量来确保某些值为正的尝试通常会被隐式转换规则所取代.
在"C++编程语言 "一书中.
所以我很困惑.我错了吗?为什么STL不遵守书中的建议?
我很想知道如果我给无符号变量赋一个负值会发生什么.
代码看起来有点像这样.
unsigned int nVal = 0;
nVal = -5;
Run Code Online (Sandbox Code Playgroud)
它没有给我任何编译器错误.当我运行程序时,nVal分配了一个奇怪的值!是否可以将某个2的补码值分配给nVal?
通过在有符号整数上使用无符号整数,是否有任何性能增益/损失?
如果是这样,这也是短期和长期的吗?