int:
32位int数据类型可以包含-2,147,483,648到2,147,483,647范围内的整数值.您也可以将此数据类型称为signed int或signed.
unsigned int:
32位无符号int数据类型可以包含0到4,294,967,295范围内的整数值.您也可以将此数据类型简称为无符号.
好的,但是,在实践中:
int x = 0xFFFFFFFF;
unsigned int y = 0xFFFFFFFF;
printf("%d, %d, %u, %u", x, y, x, y);
// -1, -1, 4294967295, 4294967295
Run Code Online (Sandbox Code Playgroud)
没有区别,噢我有点困惑.
请参阅此代码段
int main()
{
unsigned int a = 1000;
int b = -1;
if (a>b) printf("A is BIG! %d\n", a-b);
else printf("a is SMALL! %d\n", a-b);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这给出了输出:a是SMALL:1001
我不明白这里发生了什么.>运算符如何在这里工作?为什么"a"小于"b"?如果它确实更小,为什么我得到一个正数(1001)作为差异?
是否有任何c ++标准段落表示使用-1此方法是可移植和正确的方法或正确执行此操作的唯一方法是使用预定义值?
我有一个谈话与我的同事,什么是更好的:使用-1最多的无符号整数,或者使用从价值limits.h还是std::numeric_limits?
我已经告诉我的同事,使用预定义的最大值,limits.h或者std::numeric_limits是这样做的便携和干净的方式,然而,同事反对-1像数字限制一样可移植,而且更多,它还有一个优点:
unsigned short i = -1; // unsigned short max
Run Code Online (Sandbox Code Playgroud)
可以轻松更改为任何其他类型,如
unsigned long i = -1; // unsigned long max
Run Code Online (Sandbox Code Playgroud)
当使用limits.h头文件中的预定义值时,或者std::numeric_limits还需要将其与左侧的类型一起重写.
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?
我是一名读K&R的初级程序员,我觉得这本书假定了很多以前的知识.令我困惑的一个方面是内存中变量的实际表示,或者我应该说存在.数据类型到底为变量指定了什么?我不太确定如何说出这个问题......但我会问几个问题,也许有人可以为我提出一个连贯的答案.
当使用getchar()时,我被告知使用类型"int"比键入"char"更好,因为"int"可以容纳更多值而"char"只能容纳256个值.由于我们可能需要变量来保存EOF值,因此我们需要超过256个,否则EOF值将与256个字符中的一个重叠.在我看来,我认为这是一堆空洞的盒子.有人能给我一个更好的代表吗?这些"盒子"有索引号吗?当EOF与256个可用值中的值重叠时,我们可以预测它将与哪个值重叠吗?
另外,这是否意味着数据类型"char"只能在我们简单地手动为变量赋值时使用,例如char c ='a',当我们肯定知道我们只有256个可能的ASCII时字符?
另外,"char"和"int"之间的实际重要区别是什么?如果我们可以使用"int"类型而不是"char"类型,为什么我们决定在某些时候使用一个而不是另一个?是保存"记忆"(我使用引号,因为我实际上并不是"记忆"究竟如何工作).
最后,char类型的256个可用值究竟是如何获得的?我读了一些关于modulo 2 ^ n的内容,其中n = 8,但为什么这样做(与二进制有关?).什么是"modulo 2 ^ n"的模数部分(如果它与模运算有任何相关性,我看不到关系......)?
我在一些GL代码中传递一个顶点索引数组...每个元素都是一个GLushort
我希望用一个标记终止,以避免每次与数组本身一起费力地传递数组长度.
#define SENTINEL ( (GLushort) -1 ) // edit thanks to answers below
:
GLushort verts = {0, 0, 2, 1, 0, 0, SENTINEL};
Run Code Online (Sandbox Code Playgroud)
我不能使用0来终止,因为一些元素的值为0
我可以使用-1吗?
根据我的理解,这将包装到GLushort可以表示的最大整数,这将是理想的.
但这种行为在C中是否得到保证?
(我找不到这种类型的MAX_INT等效常量,否则我会使用它)
我不怀疑是否需要检查除零.我从来没有听说过负面检查分区!
if( *y == 0 )
return 0; //undefined
else
return *x / *y;
Run Code Online (Sandbox Code Playgroud)
x, y指向int32_t,我在相关的情况下包括这个细节.
在运行时,如果*x==0x80000000, *y==0xffffffff,我得到错误(在Xcode中):
EXC_ARITHMETIC(代码= EXC_I386_DIV,子代码= 0x0)
我在网上找到的所有建议都是除零,但正如你从上面的检查中看到的,我可以从调试窗口看到,这不是这里的情况.
错误意味着什么,我该如何解决?
#include <stdio.h>
int main()
{
unsigned int x=1;
char y=-1;
if (x>y)
{
printf("x>y");
}
else if(x==y)
printf("x=y");
else
printf("x<y");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
当我运行上面的代码时,它执行最后一个其他的printf,这实在令人尴尬,因为x是1而y是-1.
我认为有比较的东西,'x> y',有层次推广,因为当我将x的类型改为'int'而不是'unsigned int'时,它做得恰到好处.这个问题真的很有趣..欢迎任何答案/思考/建议.