从本质上讲,4Gb如何变成4GB?如果内存是寻址字节,那么可能性不是2 (32/8)?
我注意到在windows和linux x86上,float是4bytes,double是8,但long xins分别是x86和x86_64上的12和16.C99应该用特定的整体尺寸打破这种障碍.
最初的技术限制似乎是由于x86处理器无法处理超过80位的浮点运算(加上2个字节来进行舍入),但为什么标准与int类型相比不一致?他们为什么不至少达到80bit标准化?
这个简单的方法只是创建一个动态大小为 n 的数组,并用值 0 ... n-1 对其进行初始化。它包含一个错误,malloc() 仅分配 n 而不是 sizeof(int) * n 字节:
int *make_array(size_t n) {
int *result = malloc(n);
for (int i = 0; i < n; ++i) {
//printf("%d", i);
result[i] = i;
}
return result;
}
int main() {
int *result = make_array(8);
for (int i = 0; i < 8; ++i) {
printf("%d ", result[i]);
}
free(result);
}
Run Code Online (Sandbox Code Playgroud)
当您检查输出时,您会发现它会按预期打印一些数字,但最后的数字是乱码。然而,一旦我在循环中插入 printf() ,输出就出奇地正确,尽管分配仍然是错误的!是否有某种与 printf() 相关的内存分配?
为什么像字节中的位数这样基本的东西仍然由 C 标准实现定义?有没有这可能有用的例子?
从 C99,3.6(可在此处链接)
3.6 字节
数据存储的可寻址单元足够大,可以容纳执行环境基本字符集的任何成员
注 1:可以唯一地表达对象的每个单独字节的地址。
注 2:一个字节由连续的位序列组成,其数量由实现定义。最低有效位称为低位;最高有效位称为高位。
编辑:我问的是一些基本问题,为什么 C 标准在字节大小的位数方面提供了灵活性。不更具体地询问 sizeof(char) CHAR_BIT != 8 有什么好处。如果问题仍然看起来重复,请否决它,我将关闭问题。
阅读 C++17 草案 §6.9.1/5:
类型
char16_t和char32_t分别表示不同类型的具有相同的大小,符号性,和对准如uint_least16_t和uint_least32_t,分别在<cstdint>被称为底层类型。
现在参考 C11 草案 §7.20.1.2/2,这是 C 库继承的参考:
typedef 名称
uint_leastN_t指定宽度至少为N 的无符号整数类型,这样具有较小大小的无符号整数类型至少具有指定的宽度。因此,uint_least16_t表示宽度至少为 16 位的无符号整数类型。
注意“至少”部分。这意味着char16_t实际上可能有例如 32 位,从而形成char16_t一个 UTF-16 原始数据的错误表示的数组。在这种情况下,将此类数组写入二进制文件将导致有效代码单元与 U+0000 字符交替。
是否有充分的理由char16_t根据uint_least16_t而不是来定义uint16_t?或者它只是标准中的一个缺陷?
这个问题可能是愚蠢或偏执的,但无论如何:-).给出以下代码:
DWORD hiRes;
// will overflow about once in an hour
hiRes = GetTickCount() * 1193L;
Run Code Online (Sandbox Code Playgroud)
如果知道hiRes周期性溢出并且这种情况得到妥善处理,那么这段代码有什么问题吗?
更新:
结果对我来说非常令人惊讶,因为答案取决于hiRes(有符号或无符号)的类型,它由C标准定义(参见例如).
我知道 sizeof(char) 将始终为 1,并且这是以字节为单位的,并且一个字节可以是任意数量的位(我相信大于或等于 8 的任意数量的位,但不是正数) )。
我还经常看到提到如何根据 C 数据类型大小之间的关系来指定 C 数据类型大小的参考资料,例如“sizeof(int) <= sizeof(long)”。
我的问题基本上是:在一个字节为 8 位、一个 int 为 39 位(或其他不能被 CHAR_BIT 整除的值)的系统上,“sizeof(int)”的计算结果是什么。
我的猜测是 sizeof() 返回存储类型所需的最小字节数,因此它会向上舍入到下一个字节。因此,在我的 39 位 int 示例中,sizeof(int) 的结果将为 5。
它是否正确?
另外,是否有一种简单的方法来确定特定类型可以容纳的位数,该方法是 100% 可移植的并且不需要包含任何标头?这更多的是一种学习体验,而不是实际应用。我在实践中只使用 stdint 类型。我在想也许是声明变量并将其初始化为~0,然后循环并左移直到它为零。
谢谢!
在 Linux 上编程 C++ 时应该使用哪些类型?使用类型 from 是否是个好主意stdint.h,例如int16_tand uint8_t?
一方面,肯定stdint.h无法在 Windows 上进行编程。另一方面,short在第一批眼睛上,eg 的大小并不清楚。而且写起来更直观,int8_t而不是char......
C++ 标准是否保证标准类型的大小在未来不会改变?
考虑这段代码
T* pa = new T(13);
int address = reinterpret_cast<int>(pa);
Run Code Online (Sandbox Code Playgroud)
其中T可以是任何内置类型.
1)我无法理解重新诠释这里有什么问题?
2)这种铸件会导致不确定的行为的情况是什么?
3)将pa始终包含内存地址的正确十进制表示?
我正在浏览http://www.parashift.com/c++-faq/index.html,在那里我发现该字节也可以是64位http://www.parashift.com/c++-faq/very-large- bytes.html.是否有可能以及一个字节的大量存储容量的用途是什么?
我需要访问main函数中定义的变量a的值,而不将其作为参数传递.
main()
{
int a=10;
func();
printf("%d\n",a);
}
void func(){
//i need access of variable a here.
}
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点?
代码:
#include <stdio.h>
#include <stdarg.h>
#include <stdlib.h>
typedef unsigned int uint32_t;
float average(int n_values, ... )
{
va_list var_arg;
int count;
float sum = 0;
va_start(var_arg, n_values);
for (count = 0; count < n_values; count += 1) {
sum += va_arg(var_arg, signed long long int);
}
va_end(var_arg);
return sum / n_values;
}
int main(int argc, char *argv[])
{
(void)argc;
(void)argv;
printf("hello world!\n");
uint32_t t1 = 1;
uint32_t t2 = 4;
uint32_t t3 = 4;
printf("result:%f\n", average(3, t1, t2, t3));
return …Run Code Online (Sandbox Code Playgroud) 我有以下变量var,它是一个无符号的32位值.我正在研究一个小端系统.
unsigned long var = 1;
// Representation: 00000000 00000000 00000000 00000001
Run Code Online (Sandbox Code Playgroud)
现在我想通过以下方式访问第一个和最后一个16位:
(((unsigned short*)&var)[0])) => 00000000 00000001
(((unsigned short*)&var)[1])) => 00000000 00000000
Run Code Online (Sandbox Code Playgroud)
这种类型的指针地址类型拆分是否有任何C文档?我得到了这个工作,但我不知道这是如何工作的.
谢谢