我试图找出无符号数据类型的最小值和最大值。我知道最小无符号值是 0,最大值是 (2^n)-1。但是,当我尝试运行我的程序时(我无法发布我的代码,但您可以参考此),我一直将 -1 作为最大值。有人可以向我解释为什么吗?另外,UINT_MAX 给我 4294967295,而 ULLONG_MAX 是 4294967295。但是,unsigned int 的最大值应该是 65535,而 unsigned long long int 应该是 +18,446,744,073,709,551,615。为什么输出不同?
在C中,有符号整数和无符号整数在内存中的存储方式不同.当类型在运行时清除时,C还隐式转换有符号整数和无符号整数.但是,当我尝试以下代码段时,
#include <stdio.h>
int main() {
unsigned int a = 5;
signed int b = a;
signed int c = *(unsigned int*)&a;
signed int d = *(signed int*)&a;
printf("%u\n", a);
printf("%i\n", b);
printf("%i\n", c);
printf("%i\n", d);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
预期产量:
5
5 //Implicit conversion occurs
5 //Implicit conversion occurs, because it knows that *(unsigned int*)&a is an unsigned int
[some crazy number] //a is casted directly to signed int without conversion
Run Code Online (Sandbox Code Playgroud)
然而,实际上,它输出
5
5
5
5
Run Code Online (Sandbox Code Playgroud)
为什么?
我正在学习C,最近我的课程指针和内存地址.老师告诉我们,内存位置基本上是无符号数字,因此我们可以使用以下代码显示它们:
int a;
printf("%u", &a);
Run Code Online (Sandbox Code Playgroud)
要么
int a, *p=&a;
printf("%u", p);
Run Code Online (Sandbox Code Playgroud)
事实上,这是有效的,但我也在一些论坛中读到,应该使用%p或%x来打印地址.所以,它们必须是十六进制数...我上面看到的整数实际上是十六进制数转换为十进制吗?实际上它们的基本形式是什么地址 - 十六进制或整数或简单的二进制数.
请帮帮我.
我写了一个简单的Fibonacci序列生成器,看起来像:
#include <iostream>
void print(int c, int r) {
std::cout << c << "\t\t" << r << std::endl;
}
int main() {
unsigned long long int a = 0, b = 1, c = 1;
for (int r = 1; r <= 1e3; r += 1) {
print(c, r);
a = b;
b = c;
c = a + b;
}
}
Run Code Online (Sandbox Code Playgroud)
然而,当r价值达到40左右时,奇怪的事情开始发生.c尽管他是一个unsigned整数,但它的价值在负面和正面之间振荡,当然斐波纳契序列不可能就是这样.
这是怎么回事用unsigned long long整数?
是否c得到过大,即使是long long整数?
我的开发环境包含用于ARM OMAP Sitata的g ++交叉编译器.当向unsigned int*添加unsigned int时,我发现了一个简单的指针算法的不寻常的细微差别,如下所示:
unsigned int* dst_base_addr;
unsigned int* dst_addr;
unsigned int dst_offset;
Run Code Online (Sandbox Code Playgroud)
只是尝试将(unsigned int)添加到(unsigned int*)
dst_addr = dst_base_addr + dst_offset;
Run Code Online (Sandbox Code Playgroud)
上述内容并未被解释为人们可能会天真地想到,但实际上会产生以下等效结果
dst_addr = (unsigned int*)((unsigned int)dst_base_addr + (dst_offset << 2));
Run Code Online (Sandbox Code Playgroud)
补救当然是按照以下方式进行适当的类型转换
dst_addr = (unsigned int*)((unsigned int)dst_base_addr + dst_offset);
Run Code Online (Sandbox Code Playgroud)
问题:为什么在这种情况下甚至需要正确的类型转换?
#include <stdio.h>
main() {
unsigned a = -20;
unsigned b = 10;
printf("%d\n", (a % b));
printf("%d\n", (-20 % 10));
}
Output:
6
0
Run Code Online (Sandbox Code Playgroud)
第二个printf打印预期值0,而第一个printf打印6.为什么这个意外输出带有无符号整数?
我想生成一个16位无符号整数(uint16_t),它可以表示如下:
我们如何使用目标C来做到这一点.我想稍后解析这些数据以获取这些组件.请指教.
c ×5
c++ ×4
unsigned ×2
cocoa-touch ×1
ios ×1
memory ×1
modulus ×1
objective-c ×1
pointers ×1
types ×1