C和C 中的整数类型及其用PrintF进行解释
Integer types in C and C++, and their interpretation by printf
我最近回答了一个问题,发现自己在此过程中自己有些不确定一些事实,所以我想对这些事实进行第二次主张:ol>
C和C 中的整数类型:
-
char
:一个大小为1字节的整数值。 -
short
:大小为2个字节的整数值。 -
long
:一个大小为4个字节的整数值。 -
long long
:大小为8个字节的整数值。
类型short
,long
和long long
通常是int
。
这不是必须的,我们可以在没有int
的情况下使用它们。
另外,我们只能说明int
,但这可能会通过不同的编译器来解释。
因此,总结一下:
-
short
与short int
相同,但不一定与int
相同。 -
long
与long int
相同,但不一定与int
。 -
long long
与long long int
相同,但不一定与int
。 -
在给定的编译器上,
int
是short int
或long int
或long long int
。
使用printf
打印整数:
-printf("%d"...)
从堆栈中读取int
值。
-printf("%ld"...)
从堆栈中读取long int
值。
-printf("%lld"...)
从堆栈读取long long int
值。
so:
-printf("%ld"...)
将在任何给定平台上读取4个字节。
-printf("%lld"...)
将在任何给定平台上读取8个字节。
-printf("%d"...)
将读取2个字节或4个字节或8个字节,具体取决于给定平台上的int
的定义。
上面的描述中是否有任何空腔?
谢谢
有几个相当大的漏洞。
a char
总是占1个字节。那就是保证大小的仅类型。所有其他基本上都是1个或以上的字节,并且足够大,可以容纳指定的值范围(short
或int
的16位,long
的32位,long long
的64位。
换句话说,您给出的尺寸很常见,但不能保证。
使用printf
:
- "%d"指定
int
- "%ld"指定
long int
- "%lld"指定
long long int
。
如上所述,它们中的每一个都有指定的最小范围,但没有所需的尺寸。
同样,该标准实际上并未指定机器具有堆栈(以及一些,例如IBM大型机和旧crays,而不要),尽管如果您仅考虑抽象行为要求,那么您得到的就是
许多问题....
许多答案....
op: long
:大小为4个字节的整数值。
答:long
是一个整数,最小范围为-2147483647至 2147483647,因此它需要在最少 32位。
op: long long
:大小为8字节的整数值。
答:long long
是一个整数,最小范围为-922372036854775807至 922233720372036854775807,因此需要在 64位。
op:类型short
,long
和long long
之后是int
。
答:我本身会更频繁地看到short
,long
和long long
,然后使用以下int
,除非它在像C Spec一样的pectantic使用中。
答:进一步(不是我的意见):short int i
与short i
相同。long int i
与long i
相同。long int i
与long i
相同。
答:进一步:short signed int i
与short i
相同。short
,signed
,int
可能以任何顺序发生以相同结果。
op:但是,这不是必须的,我们可以在没有int
的情况下使用它们。
答:是的。往上看。
op:另外,我们只能说明int
,但这可能会通过不同的编译器来解释。
答:大小/范围可能会改变,但是short
与signed short
相同,与signed short int
相同,与signed int
相同。这与"长"answers"长"answers" char"相关。
OP:short
与short int
相同,但不一定与int
相同。
答:是。
OP:long
与long int
相同,但不一定与int
相同。
答:是。
op:长时间与长时间的长度相同,但不一定与int相同。
答:是。
OP:在给定的编译器上,int
是short int
或long int
或long long int
。
答:不。所有4个大小都不同/范围。
op:-printf("%d" ...)从堆栈中读取int
值。
OP:-printf("%ld" ...)从堆栈中读取long int
值。
OP:-printf("%lld" ...)从堆栈中读取long long int
值。
答:是的 - 存在"堆栈"以外的其他机制。最好想到来自variadic参数的int
。
op:-printf("%ld" ...)将在任何给定平台上读取4个字节。
OP:-printf("%lld" ...)将在任何给定平台上读取8个字节。
OP:-printf("%d" ...)将读取2个字节或4个字节或8个字节,具体取决于给定平台上INT的定义。
答:否。long
的大小至少与int
一样多。long long
的大小至少与long
一样多。读取的字节数是平台依赖的。
C中"字节"的定义是"可寻址的数据存储单元,足以容纳执行环境的基本字符集的任何成员"。因此,sizeof(char)
-> 1或在C
中1字节,无论是8、9、32还是任何位尺寸。
在较大的世界中,许多人认为"字节"是8位。这两个"字节"定义可能会混淆。在谈论C
时,我更喜欢说"短大小为4",意为 sizeof(int)
-> 4或两倍或两倍的 char
,而无需使用"字节"。
您的某些断言不正确,因为它们因平台而异。要确保您的类型宽度,请打开您的limits.h
和float.h
文件。您也可以使用sizeof
操作员。
请记住,char
始终是一个字节,无论它有多少位。也就是说,在某些机器上,char
是8位,而在另一个机器上,char
为16位。在每种情况下,它都被认为是一个字节。其他类型是char
的倍数。
您不能确定地说,如果没有咨询限制,则任何整数类型的大小是给定平台的。h和stdint.h。但是,您可以确定printf
格式字符串将正确的模式与正确尺寸的整数相关联,用于给定实现。
- 请解释"函数1(p1,p2,p3);"的输出
- 请解释这句话(cout<<1+int((a<b)^((b-a)&1) )<<endl
- 被解释为低级别const的const对象的地址
- 计算每个节点的树高,帮助我解释这个代码解决方案
- MSVC将仅移动结构参数解释为指针
- 为什么在C的循环中使用printf的Rust代码不显示输出,而在C++的循环中显示std::cout
- 内联程序集printf将整数解释为地址
- 有人能解释一下为什么下界是这样工作的吗C++的
- 为什么mpfr_printf与十六进制浮点(%a转换说明符)的printf不同
- Visual Studio(或任何其他工具)能否将地址解释为调用堆栈(boost上下文)的开头
- 我是c ++的新手,你能解释一下在这种情况下的指针吗
- 有人能为我解释一下C++代码吗
- 你能解释一下什么运行时错误是如何解决它的吗?
- 请解释字谜的代码,我看不懂计数器数组,每个值已经是0
- C++ Setter/Getter,cout 工作,printf 失败
- 有人可以向我解释为什么控制台输出 0 吗?
- 有人可以解释一下这段代码如何能够反转字符串
- C和C 中的整数类型及其用PrintF进行解释
- printf -奇怪的类型混杂结果.有人能解释一下吗?
- 解释C++中的#define PRINTF if(false)PRINTF